使用“ps”工具查看VSZ使用量
VSZ 是 Virtual Set Size,进程的总虚拟内存大小,即交换和 内存 中的内存总量。
手册页说明
vsz VSZ virtual memory size of the process in KiB (1024-byte units). Device mappings are currently excluded; this is subject to change. (alias vsize). 进程的虚拟内存大小,单位为KiB(1024字节单位)。设备映射目前被排除在外;这可能会发生变化(别名vsize)。
示例:
# ps aux | sed -e '1p' -e '/amsHelper/!d' | grep -v sed USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 2071 0.0 0.0 176508 11620 ? Ss Jul31 0:27 /sbin/amsHelper -f
VSZ 大小约为 172MB
重要说明:在 linux 中运行的大多数程序都使用共享库。
请注意,VSZ 和 RSS 将与进程一起显示共享库使用的内存。
由于一个进程使用的共享库可以被另一个进程使用而不会重复,这将导致内存占用过多。
使用“ps”工具查看RSS的使用情况
ps 显示有关所选活动进程的信息。
默认情况下,当执行 ps 时,我们会得到以下列列表
# ps aux | head -n 1 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
这里的RSS是Resident Set Size,进程使用的非交换物理内存。
手册页说明:
rss RSS resident set size, the non-swapped physical memory that a task has used (in kiloBytes). (alias rssize, rsz). 常驻集大小,任务已使用的非交换物理内存(以KB为单位)(别名rssize,rsz)。
重要说明:RSS 字段不计算进程的某些部分,包括页表、内核堆栈、struct thread_info 和 struct task_struct。
这通常是至少 20 KiB 的始终常驻内存。
示例:
# ps aux | sed -e '1p' -e '/amsHelper/!d' | grep -v sed USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 2071 0.0 0.0 176508 11620 ? Ss Jul31 0:27 /sbin/amsHelper -f
根据 RSS,amsHelper 正在使用 ~11MB
Linux如何查看进程的线程数?
我们可以使用以下命令检查每个进程的活动线程数
# cat /proc/$(pgrep amsHelper)/status | grep -i Threads Threads: 1
# cat /proc/$(pgrep java)/status | grep -i Threads Threads: 2527
如我们所见,我的“amsHelper”进程正在单线程上运行,而“java”进程正在运行 2527 个线程
我的 amsHelper 进程的 VmData 大小是 ~6MB
# grep -i vmdata /proc/$(pgrep amsHelper)/status VmData: 6964 kB
使用 pmap 查看每个进程的内存使用情况
要获得进程消耗的内存的更精确计数,请使用 pmap 命令。
“pmap”是另一种工具,它分别报告每个进程或者多个进程的内存使用情况,这将有助于跟踪进程使用的确切内存。
使用“-X”我们可以获得更详细的输出
# pmap -X $(pgrep amsHelper) 2071: /sbin/amsHelper -f Address Perm Offset Device Inode Size Rss Pss Referenced Anonymous Swap Locked Mapping 00400000 r-xp 00000000 fd:00 13936 1632 1032 1032 1032 0 0 0 amsHelper 00798000 r--p 00198000 fd:00 13936 4 4 4 4 4 0 0 amsHelper 00799000 rw-p 00199000 fd:00 13936 52 44 44 44 16 0 0 amsHelper 7eff2ac7a000 r--s 00000000 fd:00 276277 264 264 264 264 0 0 0 modules.dep 7eff2acbd000 rw-p 00000000 00:00 0 56 56 56 56 56 0 0 7eff2accb000 r--s 00000000 fd:00 132676 28 24 2 24 0 0 0 gconv-modules.cache 7eff2acd3000 r--p 00021000 fd:00 3107 4 4 4 4 4 0 0 ld-2.17.so 7eff2acd4000 rw-p 00022000 fd:00 3107 4 4 4 4 4 0 0 ld-2.17.so 7eff2acd5000 rw-p 00000000 00:00 0 4 4 4 4 4 0 0 7ffeccb5d000 rw-p 00000000 00:00 0 132 32 32 32 32 0 0 [stack] 7ffeccb7e000 r-xp 00000000 00:00 0 8 4 0 4 0 0 0 [vdso] ffffffffff600000 r-xp 00000000 00:00 0 4 0 0 0 0 0 0 [vsyscall] ====== ===== ===== ========== ========= ==== ====== 176512 11620 10026 11620 6912 0 0 KB
这里所有没有权限的映射都是缓冲区段,具有只读权限的映射将使用地址空间而不是实际内存,因此在计划计算进程/应用程序的内存使用情况时可以忽略
下面是一个小的正则表达式,可用于通过排除所有缓冲区段来计算“amsHelper”进程的资源内存
# pmap -X $(pgrep amsHelper) | egrep -v "---p" |egrep -v "r--p" | awk '{Total+=} END {print Total/1024" MB"}' 11.3477 MB
对于我的 Java 进程
# pmap -X $(pgrep java) | egrep -v "---p" | tail -n 1 | awk -F " " '{print /1024" MB"}' 345.441 MB
查看内存利用率统计信息的简短摘要。
# free
查看虚拟内存统计信息。
# vmstat
查看内存使用统计的详细信息。
# cat /proc/meminfo
重复查看报告内存和交换空间利用率统计信息(示例的采样为 5 秒,计数为 10)
# sar -r 5 10
没有简单或者非常可靠的方法来识别单个进程或者程序或者应用程序使用的实际内存量,因为每个进程都将使用来自各种库(如 glibc)的多个系统映射,这些库也将被许多其他进程使用,因此报告的内存将包括这些其他缓冲区段使用的内存。
虽然我们可以通过使用以下方法来足够接近实际的内存利用率。
但是仍然有几种方法可以用来为我们提供一些与内存相关的数据,可以满足要求。
重复查看虚拟内存统计信息(示例的采样为 5 秒。
)
# vmstat 5
来自进程状态的 VmData 使用情况
VmData 计算为减去共享和堆栈页面的总地址空间使用量(即 VmSize)。
重要说明:当我们检查的进程是多线程时,这可能会误导很多次。
对于单线程进程,这可以提供更多有用的信息。
查看slab利用率统计的详细信息。
# cat /proc/slabinfo