Bash

為什麼我的腳本慢慢地使用越來越多的記憶體?是因為midori嗎?

  • August 6, 2016

我做了一個腳本來無限循環顯示各種網站,並註意到系統正在慢慢消耗越來越多的記憶體。否則該腳本可以完美執行。

根據我從top命令中收集到的資訊,我相信它midori(網際網路瀏覽器)正在消耗所有(嗯,至少很大一部分)記憶體。我midori的配置為打開目前選項卡中的所有頁面,因此只有一個midori正在執行的實例並且只有一個選項卡打開,但它仍然繼續增加它的記憶體使用量。

#Start VNC Server
x11vnc -display :0 -usepw -listen ip_addr &

#Sites to display
SITES=( "a bunch of urls here..." )
#Display Time (In Seconds)
TIME=( 125 35 35 35 35 35 20 20 20 20 20 20 20 20 20 30 )


#Open the browser and enter fullscreen mode
midori http://google.com &
sleep 15
xdotool key F11

#Infinite Loop
while [ 1 -eq 1 ]; do

#Loop through each site
for ((i=0;i<${#SITES[@]};++i)); do
       #Open the site
       midori ${SITES[i]} &

       #Check to see if the site has a display time set in the TIME variable
       if [ -z ${TIME[i]} ];
       then #If the display time is not set, display for 30 seconds
               sleep 30
       else #Display for the appropriate amount of time
               sleep ${TIME[i]}
       fi
done
done

有任何想法嗎?謝謝。

編輯:

值得一提的是,當我說它“慢慢地”使用更多記憶體時,我的意思是非常緩慢;執行腳本約 7 小時後,記憶體消耗從 35% 變為 61%。

Web 瀏覽器是臭名昭著的記憶體豬和記憶體洩漏者,特別是如果他們正在查看的頁面有任何 javascript。這只是他們本性的一部分。除了可能的文本模式瀏覽器lynx,我認為我從未見過隨著時間的推移不會洩漏記憶體的瀏覽器。

在顯示最後一個選項卡後,您是否需要瀏覽器留在螢幕上?如果不是,則pkill midori介於兩done行之間。如果你這樣做,那麼pkill midori ; midori ${SITES[i]} &。或者,在for循環中:[ "$i" == "${#SITES[@]}" ] && pkill midori就在執行之前midori。或從 0 循環到 $ ((" $ {#SITES

$$ @ $$" - 1)),然後在第一個done. 或者,可能是最簡單的,就pkill midoriwhile語句之後(如果 midori 沒有執行,則不會列印任何錯誤消息,除非您使用 執行,否則不會發生任何事情set -e)。

如果您沒有pkill安裝(它procps在 debian 和 raspbian 的軟體包中),您可以在 midori 程序被殺死和重新啟動時擷取它的 PID,並殺死該特定 PID。例如

while [ 1 ]; do
 mPID=0

 for ((i=0;i<"${#SITES[@]}";++i)); do
   midori "${SITES[i]}" &
   [ "$mPID" -eq 0 ] && [ -n "$(jobs -n)" ] && mPID=$!
   [ "$mPID" -eq 0 ] && echo "couldn't start midori" && exit 1

   # sleep for for display time if set, otherwise 30 secs.
   [ -n "${TIME[i]}" ] && sleep "${TIME[i]}" || sleep 30
 done
 kill "$mPID"
done

這不僅讓任何的midori 程序$!的 PID 啟動(是最近的後台作業的 PID),它還檢查它是否已經啟動。如果 midori 由於任何原因未能執行,則它會退出並顯示錯誤消息。


如果您沒有在 rpi 上執行,則可以在可能的情況下為系統添加更多 RAM。這是提高系統性能和響應能力的一種相當便宜的方法,核心將使用任何“未使用”的 RAM 來記憶體磁碟。


我寫了一個你可能會覺得有用的腳本,呼叫mem-pigs.sh它來計算指定程序的記憶體使用量。預設為我經常使用的瀏覽器(因為它們是記憶體豬)。

#! /bin/bash

# print total RSS memory usage for program(s) with multiple pids

# set default if no args
[ -z "$1" ] && set -- chromium firefox midori

for p in "$@" ; do
 printf "%s:\t%s %s\n" "$p" $( 
   ( printf '1024*(%s)\n' \
       $(awk '
              BEGIN {if (ARGC==1) { print 0 ; exit } };
              /VmRSS:/ {print $2}
             ' \
           $(pgrep "$p" | sed -e 's:^:/proc/:;s:$:/status:') | 
         paste -sd+)
   ) | 
     bc | 
     human-numbers.pl)
done

樣本輸出:

$ mem-pigs.sh
chromium:   9.81 GiB
firefox:    1.39 GiB
midori: 2.76 GiB

midori如果我將它用作通用瀏覽器,可能會使用更多,但我僅將它用於 facebook 而沒有其他用途。chromium 和 firefox 用於隨機瀏覽我感興趣的東西。

chromium是真正的豬。目前它只使用了 10GB,但那是因為我幾個小時前因為升級而重新啟動了它(在那之前大約是 14GB)。同樣firefox,它通常在 4-6GB 左右。但我讓它們一次執行數週或數月,每個視窗有十幾個或三個選項卡,每個視窗有 20 個或更多視窗。每個視窗都主要針對我正在閱讀的特定主題。

看到特別使用了多少鉻,我有點驚恐……然後我想“將我的 RAM 翻倍到 32GB 只需 100 美元”。現在我真的不在乎。如果我的主機板是 DDR4 或者 32GB DDR3 DIMM 不是不合理的貴,我會升級到 64GB。

mem-pigs.sh使用另一個腳本,human-numbers.pl

#! /usr/bin/perl

use strict;
use warnings;

my $units = 1024;
my @suffixes=map { $_ ne 'B' && $_ } qw(B KiB MiB GiB TiB PiB EiB ZiB YiB);

if ( (@ARGV) && (($ARGV[0] eq '--si') || ($ARGV[0] eq '-s' )) ) {
 shift;
 $units = 1000;
 @suffixes=map { $_ ne 'B' && $_ } qw(B KB MB GB TB PB EB ZB YB);
};

# Use stdin and/or command-line args as input
# NOTE: command-line args are processed AFTER lines from stdin)
# TODO: option to process args BEFORE STDIN.
my @input = @ARGV;
@ARGV=();

if ( -p STDIN ) {
 while (<>) {
   push @input, $_;
 };
};

my $index=0;

for (@input) {
  my $n = $_ ;
  my $index = 0;

  for (@suffixes) {
    last  if $n < $units ;
    $n = $n / $units;
    $index++
  };

  printf "%.2f %s\n", $n, $suffixes[$index];
}

引用自:https://unix.stackexchange.com/questions/301356