실제로 묻기 전에 명확하게 말하면 : 예, 디스크 캐시에 대해 알고 있습니다. 아니요, 그것은 내 경우가 아닙니다 🙂 죄송합니다,이 프리앰블 🙂
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의 스왑을 사용하고 있습니다. 다른 서비스 또는 응용 프로그램을 실행하려고 할 때의 동일한 그림-모두 스왑으로 이동하여 top
MEM이 사용되지 않음을 나타냅니다 (모든 프로세스에서 최대 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을 사용하도록하고 대신 스왑으로 이동해야하기 때문입니다.
마지막으로, 누군가가 실제로 어떤 프로세스가 메모리를 그렇게 많이 사용하는지 알아내는 방법에 대한 아이디어가 있다면?
답변
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
답변
프로세스 메모리를 MB 단위로 표시하고 프로세스 경로를 표시하십시오.
ps aux | awk '{print $6/1024 " MB\t\t" $11}' | sort -n
답변
서버에서 동일한 증상을 나타내지 만 여전히 메모리 고갈을 나타내는 참고 사항입니다. 결국 32GB의 RAM이있는 상자의 sysctl.conf와 12000으로 구성된 거대한 페이지가있는 DB에 대한 설정이 발견되었습니다.이 상자에는 2GB의 RAM 만 있으므로 모든 사용 가능한 RAM을 큰 페이지에 할당했습니다 960 명). 아무 것도 사용되지 않았기 때문에 큰 페이지를 10으로 설정하면 모든 메모리가 해제됩니다.
HugePages_ 설정을 찾기 위해 / proc / meminfo를 빠르게 확인하면 하나 이상의 예기치 않은 메모리 호그 문제를 해결할 수 있습니다.
답변
필자의 경우 문제는 서버가 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
답변
ps 명령을 사용하여 프로세스에 대한 자세한 정보를 얻을 수도 있습니다.
ps aux | less
답변
파이썬 프로세스에서 사용하는 이 메모리 와 총 메모리를 참조 합니까? -스택 오버플로 , 이것이 나의 대답입니다. 이제 특정 프로세스 (파이썬) 수 도구를 얻습니다.
# 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
참고
답변
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") }
'