在Linux下查看分析内存使用情况
简介
在 Linux 中,内存使用分析对于确保系统有足够的资源来运行其进程非常重要。有几种工具可以帮助分析 Linux 中的内存使用情况,包括 top、free、vmstat 和 smem。
更详细的内存分析工具之一是 smem,它可以提供有关每个进程和每个用户的内存使用情况的信息。使用 smem 的一些优势包括能够查看进程的大小比例、共享库的大小比例以及所有其他映射的大小比例。
/proc/meminfo 是 Linux 操作系统中的一个文件,提供有关系统内存使用情况的信息。它包含几个字段,提供有关系统内存使用情况的信息,包括 MemFree(表示可供使用的空闲内存量)和 MemAvailable(表示可供系统使用的内存量)。要确定 Linux 系统的内存可用性,建议查看 MemAvailable,因为它可以更准确地反映系统的内存使用情况。
在Linux操作系统中,OOM(Out of Memory)Killer是一种在系统内存不足时自动杀死进程的机制。当系统的可用内存和交换空间耗尽时,将触发 OOM Killer。然后,OOM Killer 根据进程的内存使用情况和进程的优先级等各种因素选择要杀死的进程。
总之,分析 Linux 中的内存使用情况对于确保系统有足够的资源来运行其进程非常重要。有多种工具可用于分析内存使用情况,包括 top、free、vmstat 和 smem。其中,smem 是一个更详细的内存分析工具,它提供有关每个进程和每个用户的内存使用情况的信息。要确定 Linux 系统的内存可用性,建议查看 /proc/meminfo 文件中的 MemAvailable 字段。OOM Killer 是 Linux 操作系统中的一种机制,可在系统内存不足时自动杀死进程。
linux系统下查看某个进程内存使用量
内存查看命令
1 2 3 4 5 6 7 8 9 10 | free -h top -p 2913 ## RES列以及%MEM都是内存 ps -aux | grep kafka #第6列是内存 cat /proc/2913/status ## VmRSS是内存 pmap -x 2913 ## 最后一行的RSS是内存 ps_mem #可以直接查看进程的内存 ps aux | sort -k4,4nr | head -n 10 #查看内存占用前10名的程序 ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' | sort -k5nr ## 按进程消耗内存多少排序的方法 ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' --sort -rsz ## 按进程消耗内存多少排序的方法 |
常用的工具来分析 Linux 内存使用情况是 free
和 top
。
free
命令显示的是系统的内存使用情况,包括交换区和物理内存。
top
命令提供实时的系统进程和资源监控信息,也能查看内存使用情况。
此外,还有 htop
这样的交互式命令行工具,它比 top
更加友好和易于使用。
如果想要更详细的分析 Linux 内存使用情况,还可以使用以下工具:
1.vmstat
:报告虚拟内存状态。
2.sar
:系统分析报告工具,可以报告内存和交换区使用情况。
3.smem
:一个分析进程内存使用情况的工具。
4.pmap
:一个报告进程内存映射的工具。
5./proc/meminfo
:报告内存的统计信息,通过读取该文件可以获取系统的内存使用情况。
以上工具都可以帮助更详细地了解 Linux 的内存使用情况,选择使用哪个工具取决于你的具体需求。
介绍
Linux下查看某一个进程所占用的内存,首先可以通过ps命令找到进程id,比如 ps -ef | grep kafka
可以看到kafka这个程序的进程id
可以看到是2913,现在可以使用如下命令查看内存:
1 | top -p 2913 |
这样可以动态实时的看到CPU和内存的占用率,然后按q键回到命令行
这里通过
top -p 2913
也可以简单计算占用内存的大小:7401952 KB * 0.127 = 940047.904 KB = 918MB 约等于RES列943236KB
在top命令中,
按 P 表示按cpu排序,默认也是按cpu排序
按M 表示按占用内存排序
top -u www
只显示www用户的进程
也可直接使用ps命令查看: ps -aux | grep kafka
第一个标注的地方是CPU和内存占用率,第6列的943100是物理内存使用量,单位是k,此时kafka大约占用920M内存
还可以查看进程的status文件: cat /proc/2913/status
VmRSS对应的值就是物理内存占用,大约为920M和刚才一致
另外还可以通过 top 命令动态查看内存占用
通过: ps aux | sort -k4,4nr | head -n 10
查看内存占用前10名的程序
一些指标解释
top的结果
PID:进程的ID
USER:进程所有者
PR:进程的优先级别,越小越优先被执行
NInice:值
VIRT:进程占用的虚拟内存
RES:进程占用的物理内存
SHR:进程使用的共享内存
S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数
%CPU:进程占用CPU的使用率
%MEM:进程使用的物理内存和总内存的百分比
TIME+:该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值。
COMMAND:进程启动命令名称ps的结果
1)USER: 行程拥有者
2)PID: 进程的ID
3)%CPU: 占用的 CPU 使用率
4)%MEM: 占用的记忆体使用率
5)VSZ: 占用的虚拟记忆体大小
6)RSS: 占用的记忆体大小
7)TTY: 终端的次要装置号码 (minor device number of tty)
8)STAT: 该行程的状态:
D: 不可中断的静止
R: 正在执行中
S: 静止状态
T: 暂停执行
Z: 不存在但暂时无法消除
W: 没有足够的记忆体分页可分配
<: 高优先序的行程
N: 低优先序的行程
L: 有记忆体分页分配并锁在记忆体内
9)START: 行程开始时间
10)TIME: 执行的时间
11)COMMAND:所执行的指令cat /proc/2913/status的结果:
VmSize: 虚拟内存大小。 整个进程使用虚拟内存大小,是VmLib, VmExe, VmData, 和 VmStk的总和。占所有虚拟内存分配(文件映射,共享内存,堆内存,任何内存)的份额,并且几乎在每次分配新内存时都会增长。几乎,因为如果在数据段中用新的堆内存分配代替了释放的旧分配,则不会分配新的虚拟内存。每当释放虚拟分配时,它都会减少。VmPeak跟踪的最大值VmSize-只能随时间增加。
VmLck: 虚拟内存锁。进程当前使用的并且加锁的虚拟内存总数
VmRSS: 虚拟内存驻留集合大小。这是驻留在物理内存的一部分。它没有交换到硬盘。它包括代码,数据和栈。随着访问内存的增加而增加,随着将页面调出到交换设备的次数减少。
VmData: 虚拟内存数据。堆使用的虚拟内存。随着使用堆的数据段部分而增长。由于当前的堆分配器会保留释放的内存,以防将来的分配需要它,它几乎永远不会收缩。
VmStk: 虚拟内存栈。栈使用的虚拟内存
VmExe: 可执行的虚拟内存,可执行的和静态链接库所使用的虚拟内存
VmLib: 虚拟内存库,动态链接库所使用的虚拟内存VmPeak代表当前进程运行过程中占用内存的峰值.
VmSize代表虚拟内存总大小
VmLck代表进程已经锁住的物理内存的大小.锁住的物理内存不能交换到硬盘.
VmHWM是程序得到分配到物理内存的峰值.
VmRSS是程序现在使用的物理内存.
VmData:表示进程数据段的大小.
VmStk:表示进程堆栈段的大小.
VmExe:表示进程代码的大小.
VmLib:表示进程所使用LIB库的大小.
VmPTE:占用的页表的大小.
VmSwap:进程占用Swap的大小.
Threads:表示当前进程组的线程数量.
SigPnd:屏蔽位,存储了该线程的待处理信号,等同于线程的PENDING信号.
ShnPnd:屏蔽位,存储了该线程组的待处理信号.等同于进程组的PENDING信号.
SigBlk:存放被阻塞的信号,等同于BLOCKED信号.
SigIgn:存放被忽略的信号,等同于IGNORED信号.
SigCgt:存放捕获的信号,等同于CAUGHT信号.
CapEff:当一个进程要进行某个特权操作时,操作系统会检查cap_effective的对应位是否有效,而不再是检查进程的有效UID是否为0.
CapPrm:表示进程能够使用的能力,在cap_permitted中可以包含cap_effective中没有的能力,这些能力是被进程自己临时放弃的,也可以说cap_effective是cap_permitted的一个子集.
CapInh:表示能够被当前进程执行的程序继承的能力.
CapBnd:是系统的边界能力,我们无法改变它.
Cpus_allowed:3指出该进程可以使用CPU的亲和性掩码,因为我们指定为两块CPU,所以这里就是3,如果该进程指定为4个CPU(如果有话),这里就是F(1111).
Cpus_allowed_list:0-1指出该进程可以使用CPU的列表,这里是0-1.
voluntary_ctxt_switches表示进程主动切换的次数.
nonvoluntary_ctxt_switches表示进程被动切换的次数.
查看Linux系统内存常用命令
free(推荐)
free命令是一个快速查看内存使用情况的方法,它是对 /proc/meminfo 收集到的信息的一个概述。参考:https://www.xmmup.com/linux-free-minglingxiafreeheavailablequbie.html
The free
command is a quick and easy way to get an overview of memory usage gleaned from /proc/meminfo
. It shows a snapshot of total/free physical memory and swap space of the system, as well as used/free buffer space in the kernel.
1 | $ free -h |
/proc/meminfo(推荐)
查看RAM使用情况最简单的方法是通过 /proc/meminfo。这个动态更新的虚拟文件实际上是许多其他内存相关工具(如:free / ps / top)等的组合显示。/proc/meminfo列出了所有你想了解的内存的使用情况。
进程的内存使用信息也可以通过 /proc/<pid>/statm
和 /proc/<pid>/status
来查看。
The simpliest method to check RAM usage is via /proc/meminfo
. This dynamically updated virtual file is actually the source of information displayed by many other memory related tools such as free
, top
and ps
tools. From the amount of available/free physical memory to the amount of buffer waiting to be or being written back to disk, /proc/meminfo
has everything you want to know about system memory usage. Process-specific memory information is also available from /proc/<pid>/statm
and /proc/<pid>/status
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | [root@lhrblog ~]## cat /proc/meminfo MemTotal: 3880196 kB MemFree: 935496 kB MemAvailable: 1109820 kB Buffers: 66924 kB Cached: 284768 kB SwapCached: 164764 kB Active: 1240072 kB Inactive: 828120 kB Active(anon): 1131456 kB Inactive(anon): 588252 kB Active(file): 108616 kB Inactive(file): 239868 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 6291452 kB SwapFree: 4917368 kB Dirty: 32 kB Writeback: 0 kB AnonPages: 1681876 kB Mapped: 51600 kB Shmem: 2136 kB Slab: 103120 kB SReclaimable: 61156 kB SUnreclaim: 41964 kB KernelStack: 6368 kB PageTables: 23752 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 7893628 kB Committed_AS: 5559024 kB VmallocTotal: 34359738367 kB VmallocUsed: 14420 kB VmallocChunk: 34359716348 kB Percpu: 888 kB HardwareCorrupted: 0 kB AnonHugePages: 0 kB CmaTotal: 0 kB CmaFree: 0 kB HugePages_Total: 330 HugePages_Free: 62 HugePages_Rsvd: 60 HugePages_Surp: 0 Hugepagesize: 2048 kB DirectMap4k: 233344 kB DirectMap2M: 3960832 kB DirectMap1G: 2097152 kB [root@lhrblog ~]## cat /proc/7158/statm 514999 42343 1344 13211 0 349451 0 [root@lhrblog ~]## /proc/7158/status -bash: /proc/7158/status: Permission denied [root@lhrblog ~]## cat /proc/7158/status Name: mysqld Umask: 0026 State: S (sleeping) Tgid: 7158 Ngid: 0 Pid: 7158 PPid: 6437 TracerPid: 0 Uid: 1002 1002 1002 1002 Gid: 1002 1002 1002 1002 FDSize: 256 Groups: 1002 VmPeak: 2577776 kB VmSize: 2059996 kB VmLck: 0 kB VmPin: 0 kB VmHWM: 776596 kB VmRSS: 169500 kB RssAnon: 164124 kB RssFile: 5376 kB RssShmem: 0 kB VmData: 1397672 kB VmStk: 132 kB VmExe: 52844 kB VmLib: 9660 kB VmPTE: 1620 kB VmSwap: 422768 kB Threads: 76 SigQ: 0/15076 SigPnd: 0000000000000000 ShdPnd: 0000000000000000 SigBlk: 0000000000084a07 SigIgn: 0000000000001006 SigCgt: 00000001800024e8 CapInh: 0000001fffffffff CapPrm: 0000000000000000 CapEff: 0000000000000000 CapBnd: 0000001fffffffff CapAmb: 0000000000000000 NoNewPrivs: 0 Seccomp: 0 Speculation_Store_Bypass: vulnerable Cpus_allowed: 3 Cpus_allowed_list: 0-1 Mems_allowed: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001 Mems_allowed_list: 0 voluntary_ctxt_switches: 986321 nonvoluntary_ctxt_switches: 1188 |
ps_mem(推荐)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | ## yum -y install ps_mem ## yum info ps_mem ## rpm -ql ps_mem ## ps_mem -h [root@ecs-9b83 ~]## ps_mem Private + Shared = RAM used Program 236.0 KiB + 55.0 KiB = 291.0 KiB atd 264.0 KiB + 97.0 KiB = 361.0 KiB agetty (2) 332.0 KiB + 88.0 KiB = 420.0 KiB irqbalance 508.0 KiB + 79.0 KiB = 587.0 KiB lvmetad 556.0 KiB + 70.5 KiB = 626.5 KiB auditd 592.0 KiB + 84.0 KiB = 676.0 KiB rpcbind 672.0 KiB + 53.0 KiB = 725.0 KiB crond 684.0 KiB + 114.5 KiB = 798.5 KiB chronyd 736.0 KiB + 76.0 KiB = 812.0 KiB gssproxy 812.0 KiB + 61.5 KiB = 873.5 KiB systemd-logind 948.0 KiB + 32.0 KiB = 980.0 KiB wrapper 852.0 KiB + 278.5 KiB = 1.1 MiB dbus-daemon 1.1 MiB + 119.5 KiB = 1.2 MiB master 1.4 MiB + 99.5 KiB = 1.5 MiB systemd-udevd 1.2 MiB + 409.5 KiB = 1.6 MiB pickup 1.2 MiB + 409.5 KiB = 1.6 MiB qmgr 1.3 MiB + 628.0 KiB = 2.0 MiB systemd-journald 2.7 MiB + 144.5 KiB = 2.9 MiB systemd 2.9 MiB + 238.0 KiB = 3.1 MiB dhclient 2.7 MiB + 708.0 KiB = 3.4 MiB rsyslogd 2.3 MiB + 1.7 MiB = 4.1 MiB hostwatch 3.2 MiB + 1.1 MiB = 4.3 MiB sshd (2) 6.3 MiB + 1.0 MiB = 7.3 MiB NetworkManager 5.8 MiB + 1.9 MiB = 7.7 MiB ssh (6) 7.7 MiB + 920.5 KiB = 8.6 MiB polkitd 10.3 MiB + 637.0 KiB = 10.9 MiB screen (7) 11.7 MiB + 1.0 MiB = 12.7 MiB bash (8) 12.4 MiB + 1.3 MiB = 13.7 MiB tuned 13.7 MiB + 69.5 KiB = 13.8 MiB uniagent 22.2 MiB + 1.9 MiB = 24.1 MiB hostguard 63.9 MiB + 240.5 KiB = 64.2 MiB java --------------------------------- 196.8 MiB ================================= |
同一类进程占用,每个进程占用
smem(推荐)
更多请参考:https://www.xmmup.com/linuxneicunzhuangtaijiancegongjuzhismemmingling.html
smem命令允许你统计基于/proc信息的不同进程和用户的内存使用情况。内存使用情况的分析可以导出图表(如条形图和饼图)。
smem
是一个命令行工具,它用于分析进程的内存使用情况。它通过读取系统的内存使用统计信息,然后为每个进程生成一个报告,报告的内容包括该进程使用的物理内存和共享内存。
与其他内存分析工具相比,smem
的优点在于:
1.它分析进程内存使用情况,而不是系统内存使用情况。
2.它报告每个进程占用的内存量,包括物理内存和共享内存。
3.它可以为每个进程生成详细的内存使用报告,方便比较不同进程的内存使用情况。
通过使用 smem
,你可以了解每个进程对系统内存的使用情况,并且可以识别那些进程占用了大量的内存。这可以帮助你优化系统的内存使用情况,并且避免内存不足的问题。
安装:
1 2 3 | sudo apt-get install smem yum install -y smem python-matplotlib |
运行 smem
:在终端中输入 smem
命令,即可生成内存使用报告:
1 2 3 4 5 6 7 8 | $ smem Size Command ----------- ----------- 124852 kB gnome-shell 123996 kB gnome-terminal 122916 kB Xorg 118636 kB firefox 117588 kB nautilus |
在上面的例子中,smem
生成了一个内存使用报告,报告中包括了每个进程的内存使用量(单位为 KB)以及对应的命令。
以上例子展示了 smem
的基本用法,你还可以使用 smem
的各种选项来生成更详细的报告。更多细节可以通过 man smem
命令获得。
The smem
command allows you to measure physical memory usage by different processes and users based on information available from /proc
. It utilizes proportional set size (PSS) metric to accurately quantify effective memory usage of Linux processes. Memory usage analysis can be exported to graphical charts such as bar and pie graphs.
1 | $ sudo smem --pie name -c "pss" |
top(推荐)
top命令提供了实时的运行中的程序的资源使用统计。你可以根据内存的使用和大小来进行排序。
The top
command offers a real-time view of running processes, along with various process-specific resource usage statistics. Memory related information includes %MEM (memory utilization percentage), VIRT (total amount of virtual memory used), SWAP (amount of swapped-out virtual memory), CODE (amount of physical memory allocated for code execution), DATA (amount of physical memory allocated to non-executable data), RES (total amount of physical memory used; CODE+DATA), and SHR (amount of memory potentially shared with other processes). You can sort the process list based on memory usage or size.
1 | $ top |
例如,这里的chrome进程,RES列是808796
1 | 8035340 KB * 0.101 = 811569.34 KB = 800MB 约等于RES列的808796KB |
vmstat
vmstat命令显示实时的和平均的统计,覆盖CPU、内存、I/O等内容。例如内存情况,不仅显示物理内存,也统计虚拟内存。参考:https://www.xmmup.com/linux-vmstatmingling.html
The vmstat
command-line utility displays instantaneous and average statistics of various system activities covering CPU, memory, interrupts, and disk I/O. As for memory information, the command shows not only physical memory usage (e.g., tota/used memory and buffer/cache memory), but also virtual memory statistics (e.g., memory paged in/out, swapped in/out).
1 | $ vmstat -s |
pmap
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | [root@web3_u ~]## pmap -x 25282 25282: /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf Address Kbytes RSS Dirty Mode Mapping 0000000000400000 6736 2692 0 r-x-- php-cgi 0000000000c93000 264 196 120 rw--- php-cgi 0000000000cd5000 60 48 48 rw--- [ anon ] . . . 00007fd6226bc000 4 4 4 rw--- ld-2.12.so 00007fd6226bd000 4 4 4 rw--- [ anon ] 00007fff84b02000 96 96 96 rw--- [ stack ] 00007fff84bff000 4 4 0 r-x-- [ anon ] ffffffffff600000 4 0 0 r-x-- [ anon ] ---------------- ------ ------ ------ total kB 438284 113612 107960 |
RSS :占用的物理内存 113612KB
atop
atop命令是一个终端环境的监控命令。它显示的是各种系统资源(CPU, memory, network, I/O, kernel)的综合,并且在高负载的情况下进行了彩色标注。
The atop
command is an ncurses
-based interactive system and process monitor for terminal environments. It shows a dynamically-updated summary of system resources (CPU, memory, network, I/O, kernel), with colorized warnings in case of high system load. It also offers a top
-like view of processes (or users) along with their resource usage, so that system admin can tell which processes or users are responsible for system load. Reported memory statistics include total/free memory, cached/buffer memory and committed virtual memory.
1 | sudo atop |
htop
htop命令显示了每个进程的内存实时使用率。它提供了所有进程的常驻内存大小、程序总内存大小、共享库大小等的报告。列表可以水平及垂直滚动。
The htop
command is an ncurses
-based interactive processor viewer which shows per-process memory usage in real time. It can report resident memory size (RSS), total program size in memory, library size, shared page size, and dirty page size for all running processes. You can scroll the (sorted) list of processes horizontally or vertically.
1 | $ htop |
memstat
memstat是一个有效识别 executable(s), process(es) and shared libraries使用虚拟内存情况的命令。给定一个进程ID,memstat可以列出这个进程相关的可执行文件、数据和共享库。
The memstat
utility is useful to identify which executable(s), process(es) and shared libraries are consuming virtual memory. Given a process ID, memstat
identifies how much virtual memory is used by the process' associated executable, data, and shared libraries.
1 | $ memstat -p <PID> |
nmon
nmon是一个基于ncurses的系统基准测试工具,它可以监控CPU、内存、I/O、文件系统及网络资源等的互动模式。对于内存的使用,它可以实时的显示 总/剩余内存、交换空间等信息。
The nmon
utility is an ncurses
-based system benchmark tool which can monitor CPU, memory, disk I/O, kernel, filesystem and network resources in interactive mode. As for memory usage, it can show information such as total/free memory, swap space, buffer/cached memory, virtual memory page in/out statistics, all in real time.
1 | nmon |
ps
ps命令可以实时的显示各个进程的内存使用情况。Reported memory usage information includes %MEM (percent of physical memory used), VSZ (total amount of virtual memory used), and RSS (total amount of physical memory used)。你可以使用 “–sort”选项对进程进行排序,例如按RSS进行排序:
The ps
command can show per-process memory usage in real-time. Reported memory usage information includes %MEM
(percent of physical memory used), VSZ
(total amount of virtual memory used), and RSS
(total amount of physical memory used). You can sort the process list by using --sort
option. For example, to sort in the decreasing order of RSS
:
1 | ps aux --sort -rss |
KDE System Monitor
While GNOME desktop has GNOME System Monitor, KDE desktop has its own counterpart: KDE System Monitor. Its functionality is mostly similar to GNOME version, i.e., showing a real-time history of system resource usage, as well as a process list along with per-process CPU/memory consumption.
1 | ksysguard |
GNOME System Monitor
GNOME System Monitor 是一个显示最近一段时间内的CPU、内存、交换区及网络的使用情况的视图工具。它还提供了一种查看CPU及内存使用情况的方法。
GNOME System Monitor is a GUI application that shows a short history of system resource utilization for CPU, memory, swap space and network. It also offers a process view of CPU and memory usage.
1 | $ gnome-system-monitor |
OOM KILLER
在 Linux 中,当内存紧张的时候,OOM Killer 会被触发,并自动杀死一个进程,以释放内存。当内存不足时,内核会评估系统中的所有进程,选择一个进程来杀死,以释放内存。OOM Killer 会在内存不足,系统出现内存泄露等情况时被触发。
具体的触发条件可能因 Linux 版本和系统配置的不同而有所差别,但通常情况下 OOM Killer 会在以下情况被触发:
当物理内存和交换空间的使用率都非常高,且无法通过释放内存或交换空间来释放内存。
当物理内存使用率高,且剩余的内存不足以满足系统的需求时。
当系统内存不足以满足任何一个进程的内存需求时。
关于具体的触发阈值,一般可以通过配置系统参数来调整,例如可以设置 vm.oom_kill_allocating_task
参数来控制。但通常情况下,OOM Killer 的触发阈值是由内核根据当前系统状态和内存需求动态调整的。
OOM killer选择要杀的进程是根据一定的评估策略来决定的。常见的评估策略包括:
进程的内存使用量(物理内存和交换空间)
进程的OOM评分,这个评分代表了内核对于该进程的内存占用的评估。
进程的状态,如果进程是TASK_UNINTERRUPTIBLE状态,则可能被优先杀死。
可以通过/proc//oom_score_adj文件调整每个进程的OOM评分。
总结
当分析 Linux 系统内存使用情况时,工具如 top、free、vmstat、smem 都是很好的选择。smem 比较适用于分析详细的内存使用情况,它可以分析进程和用户的内存使用情况,并以不同的方式显示进程的内存使用情况,例如,分析进程的物理内存使用情况(RSS)和共享内存的使用情况,以及用户的内存使用情况。
RSS 内存是指进程使用的物理内存,但并不包括进程占用的共享内存。如果多个进程使用了相同的共享内存,累加它们的RSS值会被重复计算,因此不是所有的物理内存都被统计在RSS内。
/proc/meminfo 中的 MemFree 和 MemAvailable 两个指标都可以反映 Linux 系统中内存的可用率情况,但更为准确的是 MemAvailable。如果想要确定是否需要扩容内存,可以参考 MemAvailable 的值。
当 Linux 系统内存使用率达到一定的阈值时,OOM Killer 就会自动杀进程。但具体的触发条件并不固定,因为 Linux 内核有很多可以调整的参数。OOM Killer 会选择将最不重要的进程杀掉,并通过不同的算法评估进程的重要性。
参考
https://www.xmmup.com/linuxfuwuqixingnengjiankong.html
http://ask.xmodulo.com/check-memory-usage-linux.html