Linux Redhat 시스템에서 메모리를 높은 수준에서 낮은 수준으로 소비하는 명령을 확인하기 위해 이 방법을 실행했습니다.
GIGA에서 그 값을 얻기 위해 이 메소드를 1024/1024로 작성했습니다.
ps -eo size,pid,user,command --sort -size |
awk '{ hr=$1/1024/1024 ; printf("%13.2f GIGA ",hr) }
{ for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' |
cut -d "" -f2 | cut -d "-" -f1 | more
58.13 GIGA java
38.39 GIGA /home/mc/lok_agent/mc.pl
36.00 GIGA /usr/lib/jvm/java
23.99 GIGA /usr/jdk64/jdk1.8.0_112/bin/java
19.42 GIGA /usr/jdk64/jdk1.8.0_112/bin/java
19.39 GIGA /usr/jdk64/jdk1.8.0_112/bin/java
19.37 GIGA /usr/jdk64/jdk1.8.0_112/bin/java
17.42 GIGA java
15.43 GIGA /usr/jdk64/jdk1.8.0_112/bin/java
15.42 GIGA /usr/jdk64/jdk1.8.0_112/bin/java
15.23 GIGA /usr/jdk64/jdk1.8.0_112/bin/java
10.18 GIGA /usr/jdk64/jdk1.8.0_112/bin/java
7.22 GIGA /usr/jdk64/jdk1.8.0_112/bin/java
7.02 GIGA /usr/jdk64/jdk1.8.0_112/bin/java
5.71 GIGA /usr/jdk64/jdk1.8.0_112/bin/java
5.57 GIGA /usr/bin/gnome
.
.
.
지금까지 위 명령의 총합이 200G를 넘었습니다.
하지만 free -g를 실행하면 168에 익숙해집니다.
free -g
total used free shared buff/cache available
Mem: 251 168 2 0 81 82
Swap: 15 11 4
그래서 내 접근 방식에 문제가 있습니다.
ps -eo size,pid,user,command --sort -size | awk '{ hr=$1/1024/1024 ; printf("%13.2f GIGA ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' | cut -d "" -f2 | cut -d "-" -f1 |more
내 구문에 어떤 문제가 있습니까?
답변1
프로세스에 사용된 메모리를 측정하는 방법에는 여러 가지가 있습니다. 문제는 프로세스가 메모리를 공유하고(동일한 공유 라이브러리를 사용하는 두 개의 프로세스가 동시에 메모리에 있다고 상상해 보십시오) 상주(RAM 칩), 스왑(디스크) 또는 가상(둘 중 하나/둘 다)이 가능하다는 것입니다. .
크기 대신 RSS를 사용하면 스와핑/더미 문제가 제거되지만 공유 문제는 제거되지 않습니다.
(아마도) 다음 버전의 procps에는 ps 및 top이 포함되어 PSS 및 USS 필드를 비례/고유 세그먼트 크기에 사용할 수 있게 됩니다. 그들은 공유 부분을 할당하거나(예: 공유 라이브러리를 사용하는 3개의 프로세스가 라이브러리 크기의 1/3을 얻음) 공유 부분을 무시합니다.