Linux : 모든 RAM을 사용하는 프로세스를 찾으십니까?


127

실제로 묻기 전에 명확하게 말하면 : 예, 디스크 캐시에 대해 알고 있습니다. 아니요, 그것은 내 경우가 아닙니다 :) 죄송합니다,이 프리앰블 :)

CentOS 5를 사용하고 있습니다. 시스템의 모든 응용 프로그램이 많이 바뀌고 있으며 시스템이 매우 느립니다. 내가 할 때 free -m, 여기 내가 가진 것이 있습니다 :

             total       used       free     shared    buffers     cached
Mem:          3952       3929         22          0          1         18
-/+ buffers/cache:       3909         42
Swap:        16383         46      16337

따라서 실제로 42Mb 만 사용할 수 있습니다! 내가 이해하는 한 -/+ buffers/cache실제로 디스크 캐시를 계산하지 않으므로 실제로 42MB 만 있습니다. 나는 틀렸다고 생각했기 때문에 디스크 캐싱을 끄려고 시도했지만 아무런 효과가 없었습니다. 사진은 동일하게 유지되었습니다.

그래서, 누가 내 RAM을 모두 사용하고 있는지 알아보기로 결정했습니다 top. 그러나 분명히 내 RAM을 사용하는 프로세스가 없다고보고합니다. 내 유일한 프로세스는 MySQL이지만 0.1 %의 RAM과 400Mb의 스왑을 사용하고 있습니다. 다른 서비스 또는 응용 프로그램을 실행하려고 할 때의 동일한 그림-모두 스왑으로 이동하여 topMEM이 사용되지 않음을 나타냅니다 (모든 프로세스에서 최대 0.1 %).

top - 15:09:00 up  2:09,  2 users,  load average: 0.02, 0.16, 0.11
Tasks: 112 total,   1 running, 111 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4046868k total,  4001368k used,    45500k free,      748k buffers
Swap: 16777208k total,    68840k used, 16708368k free,    16632k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  SWAP COMMAND
 3214 ntp       15   0 23412 5044 3916 S  0.0  0.1   0:00.00  17m ntpd
 2319 root       5 -10 12648 4460 3184 S  0.0  0.1   0:00.00 8188 iscsid
 2168 root      RT   0 22120 3692 2848 S  0.0  0.1   0:00.00  17m multipathd
 5113 mysql     18   0  474m 2356  856 S  0.0  0.1   0:00.11 472m mysqld
 4106 root      34  19  251m 1944 1360 S  0.0  0.0   0:00.11 249m yum-updatesd
 4109 root      15   0 90152 1904 1772 S  0.0  0.0   0:00.18  86m sshd
 5175 root      15   0 90156 1896 1772 S  0.0  0.0   0:00.02  86m sshd

다시 시작해도 도움이되지 않으며 매우 느리 므로이 기계 (4 코어, 4Gb RAM, RAID1)에서는 일반적으로 기대하지 않습니다.

그래서, 나는 이것이 RAM을 사용하는 디스크 캐시가 아니라고 확신합니다. 왜냐하면 일반적으로 RAM을 줄이고 다른 프로세스가 RAM을 사용하도록하고 대신 스왑으로 이동해야하기 때문입니다.

마지막으로, 누군가가 실제로 어떤 프로세스가 메모리를 그렇게 많이 사용하는지 알아내는 방법에 대한 아이디어가 있다면?


1
이것에 대한 답을 찾은 적이 있습니까?
Hackeron

@Hackeron : OP 가이 답변을 수락 했습니다 . 그래도 대답이 귀하의 질문을 해결하지 못한다는 것을 알고 있습니다. 내 서버 중 하나에서 문제를 재현 할 수 있었고 현재 문제를 해결할 방법이 있는지 조사 중입니다.
Deltik

@ 델틱 아, 알았어. 감사합니다 :)-약 12 시간 동안 사용 가능한 모든 메모리가 누출되는 서버가 2 대 있습니다.이 진단에 도움이되는 방법이 있는지 알려주십시오. IRC (irc.freenode.org)에서 "hackeron"이라는 별명으로 접근 할 수 있습니다.
Hackeron

@Hackeron :에서 "hackeron"(을)를 찾을 수 없었습니다 irc.freenode.org. 확장 된 토론을위한 대화방을 만들었 습니다 .
Deltik

ZFS 메모리 내 ARC (및 / 또는 L2ARC) 캐시는에 표시되지 않지만 free -mLinux에서 크기를 쿼리 할 수 ​​있습니다 cat /proc/spl/kstat/zfs/arcstats | grep data_size.
kqr

답변:


112

Linux에서는 top프로세스 에서 <키를 눌러 출력 표시 정렬을 왼쪽으로 이동할 수 있습니다 . 기본적으로 정렬되어 %CPU있으므로 키를 4 번 누르면 VIRT가상 메모리 크기 에 따라 정렬됩니다 .

이를 수행하는 다른 방법은 다음과 같습니다.

ps -e -o pid,vsz,comm= | sort -n -k 2

프로세스 가상 크기별로 정렬하여 출력해야합니다.

긴 버전은 다음과 같습니다.

ps --everyone --format=pid,vsz,comm= | sort --numeric-sort --key=2

그것은 Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html우분투 서버 11.10을 제공합니다.
Der Hochstapler

1
@OliverSalzburg 문제는 -o옵션입니다. RHEL4가 작동합니다. RHEL5 : ps -e -o pid,vsz,comm= | sort -n -k 2작동합니다. 오늘 밤 11시 10 분에 시도해 볼 것입니다.하지만 올바른 정렬 옵션을 찾기 전에 알려주십시오. ps -e -o pid,vsz,comm | sort -n -k 2작동하지만 현재 확인할 장소가 없습니다.
Karlson

2
-ef옵션에 익숙하지 않습니다 . 그러나 이것은 합리적인 결과를 산출하는 것으로 보인다 :sudo ps axo pid,vsz,comm=|sort -n -k 2
Der Hochstapler

1
Ty, 나는 <그것이 가능하지 않았다는 가장 큰 제안을 좋아한다 . fedora
SSH This

2
RAM 을 점유 하고 전체 명령을 표시 하는 프로세스를 가져 오도록 약간 수정 된 버전 :ps -e --format=pid,rss,args | sort --numeric-sort --key=2
sengs

71

프로세스 메모리를 MB 단위로 표시하고 프로세스 경로를 표시하십시오.

ps aux  | awk '{print $6/1024 " MB\t\t" $11}'  | sort -n

8
슈퍼 유저에 오신 것을 환영합니다. 이 코드의 기능과 문제를 해결하는 방법을 설명하기 위해 답변을 확장 할 수 있습니까? 설명 할 수없는 코드는 솔루션을 가르치지 않기 때문에 권장 하지 않습니다. 감사.
fixer1234

9
나는이 답변이 다운 투표되어 있고 그것을 설명하라는 의견을 가지고 놀랐습니다. 가장 많은 RAM을 사용하는 프로세스 좋은 대답이라고 생각합니다.
John

14

서버에서 동일한 증상을 나타내지 만 여전히 메모리 고갈을 나타내는 참고 사항입니다. 결국 32GB의 RAM이있는 상자의 sysctl.conf와 12000으로 구성된 거대한 페이지가있는 DB에 대한 설정이 발견되었습니다.이 상자에는 2GB의 RAM 만 있으므로 모든 사용 가능한 RAM을 큰 페이지에 할당했습니다 960 명). 아무 것도 사용되지 않았기 때문에 큰 페이지를 10으로 설정하면 모든 메모리가 해제됩니다.

HugePages_ 설정을 찾기 위해 / proc / meminfo를 빠르게 확인하면 하나 이상의 예기치 않은 메모리 호그 문제를 해결할 수 있습니다.


2
최근에 이것이 문제였던 다른 서버가있었습니다. 조직에 Oracle 직원이있는 경우이 설정이 범인 일 수 있습니다.
필드

5

필자의 경우 문제는 서버가 vmw_balloon모듈이 활성화 된 VMware 가상 서버라는 것입니다 .

$ lsmod | grep vmw_balloon
vmw_balloon            20480  0
vmw_vmci               65536  2 vmw_vsock_vmci_transport,vmw_balloon

달리는:

$ vmware-toolbox-cmd stat balloon
5189 MB

실제로 호스트는 약 5GB의 메모리를 회수했습니다. 따라서 내 VM에 8GB가 "공식적으로"있음에도 불구하고 실제로는 훨씬 적습니다.

$ free
              total        used        free      shared  buff/cache   available
Mem:        8174716     5609592       53200       27480     2511924     2458432
Swap:       8386556        6740     8379816

2

ps 명령을 사용하여 프로세스에 대한 자세한 정보를 얻을 수도 있습니다.

ps aux | less

호기심에서이 명령을 피하는 올바른 방법은 무엇입니까? 그것은 마지막 줄에 도달 한 END ocne을 보여줍니다 .Ctrl + C를 할 때 프로세스를 종료하지 않습니다.
KingsInnerSoul

1
@KingsInnerSoul 프레스 'Q'
enobayram

2

파이썬 프로세스에서 사용하는 메모리총 메모리를 참조 합니까? -스택 오버플로 , 이것이 나의 대답입니다. 이제 특정 프로세스 (파이썬) 수 도구를 얻습니다.

# Megabyte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum/1024 " MB"}'
87.9492 MB

# Byte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum " KB"}'
90064 KB

내 프로세스 목록을 첨부하십시오.

$ ps aux  | grep python
root       943  0.0  0.1  53252  9524 ?        Ss   Aug19  52:01 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root       950  0.6  0.4 299680 34220 ?        Sl   Aug19 568:52 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root      3803  0.2  0.4 315692 36576 ?        S    12:43   0:54 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
jonny    23325  0.0  0.1  47460  9076 pts/0    S+   17:40   0:00 python
jonny    24651  0.0  0.0  13076   924 pts/4    S+   18:06   0:00 grep python

참고


1

show-memory-usage.sh컨텐츠로 호출되는 스크립트를 작성하십시오 .

#!/bin/sh
ps -eo rss,pid,user,command | sort -rn | head -10 | awk '{ hr[1024**2]="GB"; hr[1024]="MB";
 for (x=1024**3; x>=1024; x/=1024) {
 if ($1>=x) { printf ("%-6.2f %s ", $1/x, hr[x]); break }
 } } { printf ("%-6s %-10s ", $2, $3) }
 { for ( x=4 ; x<=NF ; x++ ) { printf ("%s ",$x) } print ("\n") }
 '

6
왜? 이것은 무엇을 하는가? 어떻게 작동합니까? 사람들에게 임의의 코드를 실행하도록 지시하지 마십시오. 그 목적과 작동 방식을 설명하십시오.
CVn

2
그림 나는 안전하다고 생각되는 것을 이해하지 못하는 사람들을위한 코드를 설명 할 것이지만, downvote는 유용한 것들을 피할 수있다. 위의 답변 과 동일한 명령을 실행 하지만 AWK로 형식을 추가하고 있습니다. 나는 그것을 쓸모가 없기 때문에 개인적으로 스크립트를 실행하지는 않았지만 설명이 필요한 사람들에게 도움이됩니다.
Dooley_labs

1
코드를 읽고 실행했습니다. 필드를 테이블처럼 정렬하고 사용 된 상주 메모리를 접두사 (예 : 1.12GB, 582.79MB)로 형식화합니다.
Stéphane Gourichon

0

또한 프로세스 ID를 사용하고 사용 된 MB를 기준으로 정렬하며 프로세스를 생성 한 명령을 간략하게 설명합니다.

ps aux | awk '{print $6/1024 " MB\t\t" $2 "\t" $11}' | sort -n


0

Hyper-V의 내 우분투 서버 DISTRIB RELEASE = 18.04에 대부분의 메모리가 사용되었지만 모든 프로세스가 정상이었습니다. (나는 스냅 및 무인 패키지를 제거했지만 메모리의 95 %가 여전히 사용되었다는 것을 인정했다.)

그 대답은 Hyper-V에 동적 메모리가 있으므로 기본 시스템 사용을 위해 메모리를 사용하고 우분투를 사용 된 것으로 표시했습니다.

그것이 누군가를 돕기를 바랍니다.

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