/proc/stat
파일 을 사용하여 /proc/status
프로세스의 CPU 및 메모리 사용률을 계산하는 방법을 알고 싶습니다 . 사용자가 사용하는 총 메모리와 CPU를 계산할 수 있나요?
답변1
ps
가장 간단한 정보 인터페이스입니다 /proc
.
각 사용자의 메모리를 나열하는 한 가지 방법은 다음과 같습니다.
$ ps -e -o uid,vsz | awk '
{ usage[$1] += $2 }
END { for (uid in usage) { print uid, ":", usage[uid] } }'
정말로 proc을 사용하고 싶다면 Python이나 Perl과 같은 것을 사용하여 한 번 반복하고 /proc/*/status
사용자/사용 키/값 쌍을 해시에 저장하는 것이 좋습니다.
관련 필드는 /proc/PID/status
다음과 같습니다.
Uid: 500 500 500 500
VmSize: 1234 kB
내 생각에 이 4개의 Uid 숫자는 실제 uid, 유효 uid, save uid 및 fs uid라고 생각합니다.
실제 uid를 원한다고 가정하면 다음과 같이 작동합니다.
# print uid and the total memory (including virtual memory) in use by that user
# TODO add error handling, e.g. not Linux, values not in kB, values not ints, etc.
import os
import sys
import glob
# uid=>vsz in KB
usermem = {}
# obtain information from Linux /proc file system
# http://www.kernel.org/doc/man-pages/online/pages/man5/proc.5.html
os.chdir('/proc')
for file in glob.glob('[0-9]*'):
with open(os.path.join(file, 'status')) as status:
uid = None
mem = None
for line in status:
if line.startswith('Uid:'):
label, ruid, euid, suid, fsuid = line.split()
uid = int(ruid)
elif line.startswith('VmSize:'):
label, value, units = line.split()
mem = int(value)
if uid and mem:
if uid not in usermem:
usermem[uid] = 0
usermem[uid] += mem
for uid in usermem:
print '%d:%d' % (uid,usermem[uid])
CPU는 더욱 어렵습니다.
ps(1) 매뉴얼 페이지에는 다음과 같이 나와 있습니다.
CPU usage is currently expressed as the percentage of time spent running during the entire lifetime of a process. This is not ideal, and it does not conform to the standards that ps otherwise conforms to. CPU usage is unlikely to add up to exactly 100%.
그래서 잘 모르겠습니다. 어쩌면 top
그것이 어떻게 처리되는지 볼 수 있습니다 . 아니면 ps -e -o uid,pid,elapsed
주어진 간격으로 두 번 실행하고 두 번 뺄 수도 있습니다 .
또는 이 목적에 더 적합한 것을 설치하십시오.프로세스 회계.
답변2
이 파일을 확인할 수 있습니다 /proc/meminfo
:
cat /proc/meminfo | head -2
MemTotal: 2026816 kB
MemFree: 377524 kB
위의 두 항목을 사용하여 현재 사용되는 메모리 양을 파악할 수 있습니다.
cat /proc/meminfo | head -2 | awk 'NR == 1 { total = $2 } NR == 2 { free = $2 } END { print total, free, total - free }'