실제 메모리 사용량별로 정렬 된 최상위 프로세스를 보는 방법은 무엇입니까?


240

12G 메모리를 가진 서버가 있습니다. 상단 조각은 다음과 같습니다.

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                                                                                                                                      
12979 frank  20   0  206m  21m  12m S   11  0.2  26667:24 krfb                                                                                                                                                                                                                                                          
13 root      15  -5     0    0    0 S    1  0.0  36:25.04 ksoftirqd/3                                                                                                                                                                                                                                                   
59 root      15  -5     0    0    0 S    0  0.0   4:53.00 ata/2                                                                                                                                                                                                                                                         
2155 root      20   0  662m  37m 8364 S    0  0.3 338:10.25 Xorg                                                                                                                                                                                                                                                          
4560 frank  20   0  8672 1300  852 R    0  0.0   0:00.03 top                                                                                                                                                                                                                                                           
12981 frank  20   0  987m  27m  15m S    0  0.2  45:10.82 amarok                                                                                                                                                                                                                                                        
24908 frank  20   0 16648  708  548 S    0  0.0   2:08.84 wrapper                                                                                                                                                                                                                                                       
1 root      20   0  8072  608  572 S    0  0.0   0:47.36 init                                                                                                                                                                                                                                                          
2 root      15  -5     0    0    0 S    0  0.0   0:00.00 kthreadd

다음을 free -m보여줍니다.

             total       used       free     shared    buffers     cached
Mem:         12038      11676        362          0        599       9745
-/+ buffers/cache:       1331      10706
Swap:         2204        257       1946

올바르게 이해하면 시스템에 362MB의 사용 가능한 메모리 만 있습니다. 내 질문은 : 어떤 프로세스가 대부분의 메모리를 소비하고 있는지 어떻게 알 수 있습니까?

배경 정보와 마찬가지로 시스템이 실행 중 64bit OpenSuse 12입니다.


답변:


280

먼저, "사용되지 않는 메모리는 메모리를 낭비합니다"라는이 만트라를 잠시 반복하십시오. 리눅스 커널은 주위에 계속 그 외모보다 중요한 푸시 데이터 무엇인가 때까지, 파일 메타 데이터 및 요청 된 파일의 양. 당신이 실행할 수있는 이유입니다 :

find /home -type f -name '*.mp3'
find /home -type f -name '*.aac'

두 번째 find인스턴스가 우스운 속도로 실행되도록합니다.

리눅스는 너무 많은 노력없이 메모리 사용량의 급증을 처리하기 위해 약간의 메모리를 '무료'로 남겨 둡니다.

둘째, 모든 기억을 먹는 과정을 찾고 싶습니다. 에서 top사용 M명령은 메모리 사용을 기준으로 정렬합니다. VIRT프로세스가 사용하는 메모리의 양이 아니라 할당 된 가상 메모리의 양을 알려주 는 열 을 무시하십시오 . RES얼마나 많은 메모리가 상주 하거나 현재 램에 있는지보고합니다 (요청에도 불구하고 디스크로 스왑되거나 실제로는 할당되지 않음).

그러나 거의 모든 프로세스에 대해 RES예를 들어 /lib/libc.so.6메모리를 한 번만 계산 하므로 프로세스가 사용하는 메모리 양을 정확하게 측정하는 것은 아닙니다. 이 SHR열은 다른 프로세스와 공유 되는 메모리 양을보고 하지만 다른 프로세스가 실제로 공유하고 있다는 보장은 없습니다. 공유 가능할 수 있으며 다른 누구도 공유하고 싶지 않습니다.

smem도구는 각 개별 프로세스에서 실제로 얼마나 많은 메모리를 비난 해야 하는지를 사용자가 더 잘 파악할 수 있도록 설계되었습니다 . 실제로 독특하고 공유되는 것을 파악하고 공유 메모리를 공유하는 프로세스에 비례하여 키를 계산하는 영리한 작업을 수행합니다. smem기억력이 더 나은 곳을 이해하는 데 도움이 될 수 top있지만 top훌륭한 첫 번째 도구입니다.


따라서 "free"열 통계 만 떨어지면 top에 다른 것이 표시되지 않습니다. 파일을 저장하기 위해 리눅스 커널에 의해 메모리가 할당되고 필요한 경우 다른 프로세스에 메모리를 줄 것이라고 결론 지을 수 있습니까?
Al2O3

@Rubby, 아마 사실 일 것입니다. /proc/meminfo/proc/slabinfo더 - 파일의 커널이 스토리지를 사용하고 어떤 세부 slabtop프로그램은 매우처럼 top등 그 비율이처럼 무엇을 얼마나 할당 된 슬랩 할당 자의,하지만 쇼,
sarnold

'smem'에 대한 팁을 주셔서 감사합니다-Linux가 RAM을 "폐기"하여 내 컴퓨터가 빠르게 실행될 수 있기를 바랍니다. 두 번째 패스에서 'find'가 조금 더 오래 걸리더라도 괜찮습니다. 멈춤 된 마우스와 고정 된 윈도우는 리눅스가 어떤 RAM (불필요하게 호그를 걸 었는지)을 결정하고, 내가 지금하고있는 일에 지우고 다시 할당하거나 심지어 디스크로 스왑 할 필요가 없다. 이 상자에는 16GB의 램이 있으며 그 중 몇 GB가 무료로 유지되고 실행중인 응용 프로그램에서 사용할 수있을 것으로 기대합니다.
JosephK

@JosephK, 마우스 이동은 우선 순위 및 알고리즘 스케줄링과 더 관련이 있습니다. 마우스 포인터를 이동하기 위해 메모리 할당이 필요한 경우 사용중인 소프트웨어에 심각한 문제가 있습니다. :)
sarnold

2
@JosephK 실제로 사용 가능한 메모리를 사용하는 것보다 커널이 한 용도에서 다른 용도로 메모리를 용도 변경하는 데 시간이 덜 걸립니다. 하나는 무료 목록에 액세스하고 수정해야하지만 다른 하나는 그렇지 않습니다. 불행히도 이것은 XY 질문입니다. 문제는 성능과 관련이 있으며 메모리 사용과는 전혀 관련이 없을 수 있습니다 (메모리 여유 공간을 늘리는 것이 도움이된다는 증거에도 불구하고 OP 용의자보다 더 복잡한 이유 일 수 있음). 대신 메모리 사용량 분석에 대해 질문했습니다. 그것은 실제 문제에 대해 묻는 것보다 덜 유용한 답변을 얻습니다.
David Schwartz

321

리눅스 / 유닉스에서 최고 명령을 사용하여 빠른 팁을 사용하십시오

$ top

그리고 Shift+ 를 누르십시오 m(즉, 대문자를 쓰십시오 M).

에서 man top

SORTING of task window
  For compatibility, this top supports most of the former top sort keys.
  Since this is primarily a service to former top users, these commands do
  not appear on any help screen.
    command   sorted-field                  supported
      A         start time (non-display)      No
      M         %MEM                          Yes
      N         PID                           Yes
      P         %CPU                          Yes
      T         TIME+                         Yes

또는 Shift+ f를 누른 다음 키 n를 눌러 메모리 사용량별로 정렬 할 디스플레이를 선택한 다음 키 를 누릅니다 Enter. 메모리 사용량에 따라 주문 된 활성 프로세스가 표시됩니다


71
또는 그냥 M( Shift+ m)를 눌러도됩니다
Patryk

8
@risnandar은 MB의 메모리가 아닌 % 보여줄 수있는 방법이
codecowboy

2
codecowboy 안녕하세요, 아마 당신은 볼 수 commandlinefu.com/commands/view/3/... 내가 좋아하는 타사 응용 프로그램을 사용하고 내 서버에서 사용 자세한 메모리 newrelic.com
risnandar

6
또는 그냥 top -o mem -O cpu
건너 뛰기

우분투 16에서 나는 top -o RES달리 "인식되지 않은 필드 이름 'mem'"이 필요했다
AdamS


28

먼저 의 출력에 대한 설명을free 읽어야 합니다 . 결론 : 프로세스에서 즉시 사용할 수있는 최소 10.7GB 의 메모리가 있습니다.

그런 다음 프로세스에 "메모리 사용"이 무엇인지 정의해야합니다 (쉽거나 모호하지는 않습니다).

그렇다면 우리는 더 많은 것을 도울 수 있습니다 :-)


어디서 10.7을 얻었습니까? 버퍼 / 캐시에서 [무료]? 링크 주셔서 감사합니다, 나는 그것을 읽을 것입니다.
user3111525

3
예. 요점은 대부분의 메모리가 버퍼와 ​​캐시에 의해 사용된다는 것입니다. 프로세스에 더 많은 메모리가 필요한 경우이 메모리를 즉시 "덤프"할 수 있습니다. USED ​​양에서 버퍼 / 캐시에 사용되는 메모리 양을 빼거나 FREE 양에 추가하면 두 번째 줄에 숫자가 표시됩니다.이 숫자는 1.3 기가 실제로 사용되거나 다른 것에서 볼 수 있습니다. 각도에 따라 10.7 기가 즉시 사용 가능한 메모리가 있습니다 (버퍼 및 캐시는 요청시 인스톨 할 수 있으므로).
stolsvik 2016 년


17

ps aux --sort '%mem'

에서 procps의 'PS (우분투 12.04에 기본값) 출력을 같이 생성합니다 :

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
...
tomcat7   3658  0.1  3.3 1782792 124692 ?      Sl   10:12   0:25 /usr/lib/jvm/java-7-oracle/bin/java -Djava.util.logging.config.file=/var/lib/tomcat7/conf/logging.properties -D
root      1284  1.5  3.7 452692 142796 tty7    Ssl+ 10:11   3:19 /usr/bin/X -core :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
ciro      2286  0.3  3.8 1316000 143312 ?      Sl   10:11   0:49 compiz
ciro      5150  0.0  4.4 660620 168488 pts/0   Sl+  11:01   0:08 unicorn_rails worker[1] -p 3000 -E development -c config/unicorn.rb             
ciro      5147  0.0  4.5 660556 170920 pts/0   Sl+  11:01   0:08 unicorn_rails worker[0] -p 3000 -E development -c config/unicorn.rb             
ciro      5142  0.1  6.3 2581944 239408 pts/0  Sl+  11:01   0:17 sidekiq 2.17.8 gitlab [0 of 25 busy]                                                                          
ciro      2386  3.6 16.0 1752740 605372 ?      Sl   10:11   7:38 /usr/lib/firefox/firefox

따라서 Firefox는 내 메모리의 16 %를 차지하는 최고의 소비자입니다.

당신은 또한 관심이있을 수 있습니다 :

ps aux --sort '%cpu'

4

다음 단계에 따라 정렬 할 열을 지정할 수 있습니다.

단계 :
* 상단
* 시프트 + F
* 목록에서 열을 선택하십시오
    예를 들어 n은 메모리를 기준으로 정렬하는 것을 의미합니다.
* 엔터 키를 치시오
* 확인

1
위의 risnandar의 답변이 중복되었습니다.
benjaoming

3

터미널에서이 코드를 실행하면 메모리 사용량을 확인할 수 있습니다.

$ watch -n2 free -m
$ htop

3

프로세스 이름별로 사용한 메모리를 합계하는 방법 :

때로는 가장 큰 단일 프로세스를 보더라도 아직 사용되지 않은 메모리가 많이 있습니다. 메모리를 사용하여 동일한 작은 프로세스가 많이 있는지 확인하려면 다음과 같은 명령을 사용하여 awk를 사용하여 동일한 이름의 프로세스가 사용하는 총 메모리를 요약 할 수 있습니다.

ps -e -orss=,args= |awk '{print $1 " " $2 }'| awk '{tot[$2]+=$1;count[$2]++} END {for (i in tot) {print tot[i],i,count[i]}}' | sort -n

예 : 출력

9344 docker 1
9948 nginx: 4
22500 /usr/sbin/NetworkManager 1
24704 sleep 69
26436 /usr/sbin/sshd 15
34828 -bash 19
39268 sshd: 10
58384 /bin/su 28
59876 /bin/ksh 29
73408 /usr/bin/python 2
78176 /usr/bin/dockerd 1
134396 /bin/sh 84
5407132 bin/naughty_small_proc 1432
28061916 /usr/local/jdk/bin/java 7

0

바로이 순간

ps -U $(whoami) -eom pid,pmem,pcpu,comm | head -n4

지속적으로 업데이트

watch -n 1 'ps -U $(whoami) -eom pid,pmem,pcpu,comm | head -n4'

나는 또한 당신이 좋아할만한 몇 가지 케이크를 추가했습니다 (또는 무시할 수 있습니다)

-n 1 매초마다보고 업데이트

-U $(whoami)프로세스 만 표시합니다. $ (일부 명령) 평가

| head -n4 BC 한 번에 헤더와 3 개의 프로세스 만 표시하려면 사용량이 많은 광고 항목 만 있으면됩니다.

${1-4}내 첫 번째 주장은 $1내가 제공하지 않는 한 기본적으로 4로 설정하고 싶다고 말합니다.

Mac을 사용하는 경우 먼저 시계를 설치해야 할 수 있습니다

brew install watch 

또는 함수를 사용할 수 있습니다

psm(){
    watch -n 1 "ps -eom pid,pmem,pcpu,comm | head -n ${1-4}"
    # EXAMPLES: 
    # psm 
    # psm 10
}

그리고 당신은 쉽게 종류의 CPU에 의해 당신은 변경할 수있는 경우 -m-r
jasonleonhard

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.