ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
应用服务器,突然内存占用很高导致系统读写、运行速度慢 问题分析步骤:目前,监控平台使用的数值来自 Mem 行,计算公式为(1-available/total) 因此,当监控平台显示内存使用率处于较高水平时,即为 available 项数值处于较低水平。此时,情况可分为 used 占用较高、shared 占用较高、buff/cache 占用较高以及使用 swap 四种情况。 ![](https://img.kancloud.cn/33/a2/33a286ccad0911b5f8b197e01b978157_631x112.png) 首先使用 top 命令然后 shift+m 按照内存排序看看什么进程占用的内存过大,然后进行问题分析,如果为应用进程则需要和应用厂商沟通。 通过 free -m -t 查看内存的使用情况,看看内存主要是正在使用还是共享或者在缓存中,分析整个系统的内存使用情况。 1)used 占用较高 出现 used 占用较高的情况最为常见,先查看/proc/meminfo 内容,命令如下: \# cat /proc/meminfo 输出结果中需要关注内存大页总值 HugePages\_Total 和内存大页未使用值HugePages\_Free。内存大页默认单位为 2MHugePages\_Total 的值乘以 2M 即为内存大页占用的内存大小。如果 HugePages\_Free 的值相比 HugePages\_Total 的值较大,说明内存大页容量配置不合理,可以考虑适当缩小。例如,某些 oracle 数据库服务器出现内存占用率较高情况,检查/proc/meminfo 发现配置了内存大页,且内存大页占总物理内存超过 60%。再加上数据库程序本身占用的内存,总体内存使用率在 90%左右。由于内存大页的总量需要根据物理内存的大小进行配置,如果配置比例不合适,在运行过程中就会出现由于内存大页占比较大,导致内存占用率较高的情况。 如果经检查发现未启用内存大页,或者启用了内存大页但是使用正常,则通过 top 工具粗略地查看各个进程使用内存情况。输入命令 top 后,可以按“m”键将进程按内存使用率进行排序,命令如下: #top 输出结果中需要关注 RES 项。该项表示进程占用的物理内存大小。如果某个或者某些进程的 RES 值较高,则需要对该进程进行分析,判断是否占用过多存在异常,是否需要加以限制。如果均为正常占用,则考虑内存扩容。 2)shared 占用较高 Shared 占用部分是多进程共享内存。如果内存使用率处于较高水平,且shared 占用较高时,可以执行以下命令查看详细信息: \# df -h | grep tmpfs ![](https://img.kancloud.cn/74/19/7419ccf3447d1f76e0eec92eceffe1a7_635x175.png) 默认配置下,目录/run、/sys/fs/cgroup 和/dev/shm 都会占用 shared 内存。因此,通过 du 命令逐级锁定占用较大的文件或目录,根据文件或目录的归属确定导致 shared 占用较大的进程或程序。定位后,调整进程对应的应用程序,减少其占用或者进行清理。 3)buff/cache 占用较高 在内存调度中,buff/cache 主要用于缓存读写文件系统的数据。所以,如果内存使用率处于较高水平,且 buff/cache 占用较高时,可以执行以下命令查看详细信息,如图所示。查看输出内容的 CACHE SIZE 项,找到占用较多的内核调用。从内核调用的名称(NAME 项),可以判断出占用较大内存是 xfs 文件系统或是 nfs 文件系统等。 \# slabtop -s c ![](https://img.kancloud.cn/38/5b/385b2a3cad9ef33d7aaaa7dabb7b7b4b_411x274.png) 由于 buff/cache 占用较高与 IO 有较大关系,所以可以执行以下命令查看系统 IO 情况及对应的进程,定位进程后,需要结合 IO 进行分析,讨论优化方案。 \# iotop -o ![](https://img.kancloud.cn/c1/1b/c11b6e6c82f8185fc4159c6bdfdbbc6f_621x69.png) 4)使用 swap 通常情况下,swap 不会被使用。一旦 swap 被使用,意味着系统内存非常有可能不足,需要扩容。出现 swap 被使用的情况,一般也会存在 used 占用较高或者 buff/cache 占用较高的情况。由于使用 swap 时,内核将不常用的内存数据移至本地 swap 文件系统,当调用时再将数据从本地 swap 文件系统移回内存,效率较低。所以,不推荐日常使用 swap。如果需要,可以通过以下简单命令弄清哪些进程使用了 swap: grep swap /proc/\[1-9\]\*/smaps