나는 다양한 웹사이트를 무한 루프로 표시하는 스크립트를 작성했고 시스템이 점점 더 많은 메모리를 천천히 소모하고 있음을 발견했습니다. 그렇지 않으면 스크립트가 완벽하게 작동합니다.
명령에서 수집한 내용에 따르면 메모리의 전부(적어도 상당 부분)를 소비하는 것은 인터넷 브라우저 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%로 감소했다는 것을 의미합니다.
답변1
웹 브라우저는 악명 높은 메모리 호그이자 메모리 누수자로, 특히 보고 있는 페이지에 JavaScript가 포함되어 있는 경우 더욱 그렇습니다. 그것은 단지 그들의 본성의 일부일 뿐입니다. 다음과 같은 텍스트 모드 브라우저 외에는 lynx
이런 브라우저를 본 적이 없는 것 같습니다.아니요시간이 지남에 따라 메모리 누수가 발생합니다.
마지막 탭이 표시된 후에도 브라우저가 화면에 계속 표시되어야 합니까? 그렇지 않다면 pkill midori
두 done
줄 사이에 있습니다. 그렇다면 pkill midori ; midori ${SITES[i]} &
. 또는 for
루프에서: [ "$i" == "${#SITES[@]}" ] && pkill midori
before running midori
. 또는 0에서 $(("${#SITES[@]" - 1))까지 반복한 다음 첫 번째 done
.
또는 아마도 가장 쉬운 방법은 명령문 바로 뒤에 있는 것입니다 pkill midori
( while
midori가 실행되고 있지 않으면 오류 메시지가 인쇄되지 않으며 run을 사용하지 않으면 아무 일도 일어나지 않습니다 set -e
).
설치 하지 않은 경우 pkill
(debian 및 raspbian의 패키지에 있음 procps
) 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
이는 모든 PID를 얻을 수 있을 뿐만 아니라새로운midori 프로세스가 시작되고( $!
가장 최근 백그라운드 작업의 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
일반 브라우저로 사용했다면 아마도 더 많이 사용했을 텐데, 페이스북용으로만 사용하고 다른 것은 전혀 사용하지 않습니다. 관심 있는 콘텐츠를 무작위로 검색하려면 크롬과 파이어폭스를 사용하세요.
chromium
진짜 돼지예요. 현재는 10GB만 사용하고 있는데 업그레이드로 인해 몇 시간 전에 재부팅을 했기 때문입니다(이전에는 14GB 정도였습니다). 다시 말하지만 firefox
일반적으로 약 4-6GB입니다. 하지만 각각 12~3개의 탭과 20개 이상의 창을 사용하여 몇 주 또는 몇 달 동안 동시에 실행했습니다. 각 창은 주로 내가 읽고 있는 특정 주제에 관한 것입니다.
실제로 얼마나 많은 크롬이 사용되었는지 보고 약간 충격을 받았습니다. 그러다가 "단돈 100달러에 RAM을 32GB로 두 배로 늘릴 수 있다"고 생각했습니다. 이제 나는 정말로 상관하지 않습니다. 내 마더보드가 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];
}