前言
内存溢出我会先分成两种情况。
一种是8g内存服务器分配给服务2g内存,导致服务内存溢出。
一种是8g内存服务器把内存全部分给服务导致的内存溢出。
也就是说一种是给服务加配置,一种需要调整服务的代码处理。
思路整理
日志排查
第一步应该是日志排查。如果系统做的比较完善,服务器监控做的也比较好的话。负责人应该是第一个收到短信(或者其它)得到消息。服务出问题了。
那么这个时候处理问题的第一步就是看服务的日志。这里用tomcat举例
查看实时日志
tail -f /home/tomcat/logs/catalina.out
通常这个时候更推荐查看日志文件的最后几行,比如最后一千行。
tail -n 1000 /home/tomcat/logs/catalina.out
或者如果你想要搜索日志文件中的特定关键字(例如"error")
grep "error" /home/tomcat/logs/catalina.out
注意/home/tomcat/替换为你实际的Tomcat安装路径。
通过日志定位到具体代码和具体的操作。再根据日志对代码和数据进行分析。
服务器配置查看
vmstat 1
执行vmstat 1命令会有详细的服务器内存和cpu信息的显示。
vmstat 1
执行之后的结果示例如下:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st1 0 20480 123456 89012 456789 0 0 20 10 65 78 5 3 90 2 01 0 20480 123400 89012 456800 0 0 0 4 60 75 4 3 92 1 00 0 20480 123350 89012 456820 0 0 5 15 68 80 6 3 89 2 0
解释:
procs:
r:正在运行和等待CPU时间的进程数。
b:处于不可中断睡眠状态的进程数。
memory:
swpd:已使用的交换空间(swap)大小,单位为KB。
free:空闲内存大小,单位为KB。
buff:用作缓冲的内存大小,单位为KB。这部分内存用来存储磁盘块的缓冲区。
cache:用作缓存的内存大小,单位为KB。这部分内存用来存储从磁盘读取的文件数据,以加快后续访问速度。
swap:
si:从磁盘交换到内存的数据量(每秒),单位为KB/s。
so:从内存交换到磁盘的数据量(每秒),单位为KB/s。
io:
bi:从块设备读取的数据量(每秒),单位为KB/s。
bo:写到块设备的数据量(每秒),单位为KB/s。
system:
in:每秒发生的中断数,包括时钟中断。
cs:每秒发生的上下文切换数。
cpu:
us:用户空间占用的CPU百分比。
sy:内核空间占用的CPU百分比。
id:空闲CPU百分比。
wa:等待I/O操作的CPU时间百分比。
st:被虚拟机偷去的时间百分比(在虚拟化环境中可能会看到)
命令总结:
这个命令输出的内容很详细,但是过多。不利于快速排查问题。
free -m
free -m 命令用于显示Linux系统中内存的使用情况,单位是MB(兆字节)。
free -m
执行之后的结果示例如下:
total used free shared buff/cache available
Mem: 8000 2000 1000 300 5000 5500
Swap: 2048 0 2048
解释:
Mem: 表示物理内存(RAM)的使用情况。
total:物理内存总量,单位是MB。在这个例子中,总内存是8000MB。
used:已使用的物理内存量,包括为进程分配的内存和内核使用的内存。在这个例子中,已使用内存是2000MB。
free:未被使用的物理内存量。在这个例子中,空闲内存是1000MB。
shared:多个进程共享的内存量(这个字段在某些Linux发行版或free命令的版本中可能不显示)。在这个例子中,共享内存是300MB。
buff/cache:被用作缓冲和缓存的内存量。这部分内存可以被回收用于其他目的,如果系统需要更多内存的话。在这个例子中,缓冲和缓存内存是5000MB。
available:估计的可用内存量,考虑了缓存和缓冲区内存的可回收性。这个值比free列更准确地反映了系统可用于启动新应用程序而不必交换到磁盘上的内存量。在这个例子中,可用内存是5500MB。
Swap: 表示交换空间(swap space)的使用情况。
total:交换空间总量,单位是MB。在这个例子中,总交换空间是2048MB。
used:已使用的交换空间量。在这个例子中,没有使用交换空间(0MB)。
free:未被使用的交换空间量。在这个例子中,空闲交换空间是2048MB。
命令总结:
推荐使用。如果available列的值很低,而buff/cache列的值很高,这可能意味着系统正在积极使用缓存,但仍有足够的内存可供新进程使用(因为缓存可以被回收)。然而,如果used列的值很高,并且available列的值很低,那么你可能需要考虑增加物理内存或优化你的应用程序以减少内存使用。 如果物理内存和交换空间的used都已经满了,在不能增加服务器资源的情况下,应该是要调整代码的。
Swap详解