服务器内存爆满?10 个 Linux 急救命令,3 分钟释放内存!
当服务器内存爆满,这10个Linux命令“救大命”!
当服务器内存爆满时,最直观的感受就是网站访问变得异常缓慢。想象一下,用户满心期待地点击进入一个网站,却长时间看到屏幕上那令人焦急的加载图标,每一秒的等待都在消磨着用户的耐心。对于电商网站来说,这可能导致用户放弃购买,直接影响销售额;对于资讯类网站,用户可能会迅速转向其他竞争对手的平台,造成用户流失。
更严重的是,内存爆满还可能引发服务器死机,使整个系统陷入瘫痪状态。这对于金融机构而言,可能导致交易无法进行,造成巨额经济损失;对于医疗机构的信息管理系统,服务器死机可能会影响患者的诊断和治疗,甚至危及生命安全。由此可见,服务器内存爆满绝不是一个小问题,及时解决迫在眉睫,而熟练运用 Linux 命令则是解决这一困境的有效途径之一。
认识内存使用情况
在解决服务器内存爆满问题之前,我们首先需要清楚地了解服务器当前的内存使用情况,只有这样才能有的放矢地采取相应措施。在 Linux 系统中,有一些非常实用的命令可以帮助我们实现这一目的。
free 命令:查看内存状态
free 命令是 Linux 系统中用于查看内存使用情况的常用命令 ,它可以显示系统的物理内存、交换空间(Swap)和内核缓冲区的使用情况。其基本用法非常简单,直接在终端输入 “free” 命令,默认会以 KB 为单位显示内存信息。不过,为了让输出结果更易于阅读,我们通常会加上 “-h” 选项,以 GB/MB/KB 等人类可读格式展示。例如:
free -h
执行上述命令后,会得到类似如下的输出:
total used free shared buff/cache available
Mem: 7.7G 3.1G 1.9G 200M 2.7G 4.3G
Swap: 2.0G 500M 1.5G
下面来详细解释一下各字段的含义:
- • total:表示总内存量,这里 “Mem” 行的 “total” 是物理内存总量,“Swap” 行的 “total” 是交换区总量。上述例子中,物理内存总量为 7.7G,交换区总量为 2.0G。
- • used:已使用的内存量。需注意,这里的已使用内存包含了缓冲区和缓存占用的内存,并非单纯应用程序实际占用的内存 。在这个例子中,物理内存已使用 3.1G。
- • free:指完全未被使用的内存。但要清楚,它不包括可回收的缓冲和缓存。示例里,当前完全未被使用的物理内存为 1.9G。
- • shared:被临时文件系统(如 tmpfs)或进程间共享的内存 。如输出中显示 “shared” 为 200M,表示这部分内存由多个进程共享。
- • buff/cache :buffers 是内核缓冲区(Block Buffer)用于暂存磁盘块数据,加速磁盘 I/O;cache 是页面缓存(Page Cache)和 Slab 内存(如目录项缓存),加速文件访问 。这部分内存可被快速释放供程序使用,上述例子中 “buff/cache” 为 2.7G。
- • available:预估可用内存,它反映在不进行交换(Swap)的情况下,系统还能分配多少内存给新程序 。此值综合考虑了 free 内存和可回收的 buff/cache,比 free 列更能体现实际可用内存情况。在这个例子中,“available” 为 4.3G。
通过 free 命令,我们能快速了解系统内存的整体使用状态,包括物理内存和交换空间的使用情况,为后续分析和解决内存问题提供基础数据。
top 命令:实时监控内存
top 命令是一个强大的实时系统监控工具,它不仅可以实时查看系统进程的运行情况,还能实时监控内存的使用状态。在终端输入 “top” 命令即可启动该工具。
启动 top 命令后,会进入一个交互式界面,展示了系统中各个进程的相关信息。默认情况下,进程列表是按照 CPU 使用率进行排序的。但我们更关注内存占用情况时,可按下 “M” 键(大写),此时 top 命令会立即按照内存占用(MEM%)对进程进行排序,让内存占用最高的进程位于列表顶部,方便我们快速发现内存占用大户。比如,当服务器内存出现异常时,通过这种方式能迅速定位到是哪个进程占用了大量内存资源。
在 top 命令的输出界面中,与内存相关的信息主要有以下几列:
- • VIRT:虚拟内存使用量,包括进程使用的所有内存,无论是否被交换出去。它包含了物理内存、Swap 以及共享库等占用的内存空间。
- • RES:常驻内存使用量,表示进程当前正在使用的、未被交换出去的内存量,这是真正被进程占用的物理内存。
- • SHR:共享内存量,指该进程与其他进程共享的内存量,比如共享库所占用的内存,这部分内存不全部计入进程独占内存。
- • %MEM:内存占用百分比,它表示该进程使用的内存占系统总内存的百分比,通过这个指标可以直观地了解每个进程对内存资源的占用比例。
除了按内存占用排序外,top 命令还提供了许多实用的快捷键,能帮助我们更高效地查看和管理进程。比如,按下 “P” 键可以按照 CPU 使用率排序;按下 “T” 键可以按照累计 CPU 时间排序;按下 “k” 键可以杀死指定进程(需谨慎操作,输入进程 ID 和信号,默认信号为 SIGTERM );按下 “r” 键可以重新设置进程的 nice 值,调整进程优先级(nice 值范围为 - 20 到 19,数值越小优先级越高 );按下 “u” 键可以按用户过滤进程,只显示指定用户的所有进程。
top 命令就像一个实时监控系统资源的仪表盘,通过它我们能动态地观察到各个进程对内存及其他系统资源的占用情况,为及时发现和解决内存相关问题提供了有力支持 。无论是排查内存占用过高的进程,还是对系统性能进行全面监控和分析,top 命令都是 Linux 系统管理员和开发者不可或缺的工具之一。
释放缓存内存
在 Linux 系统中,缓存内存(buffers 和 cache)虽然有助于提高系统的 I/O 性能,但在内存紧张的情况下,释放缓存内存可以为其他进程腾出更多的可用内存。下面介绍两种释放缓存内存的方法。
sync 与 echo 释放缓存
Linux 系统中的 sync 命令是确保数据完整性的关键工具 ,其核心作用是强制将内存缓冲区(缓存)中的未保存数据写入物理磁盘,防止因系统崩溃、断电或意外操作导致数据丢失。
Linux 为提高 I/O 性能,会将写入操作暂存于内存缓冲区(称为 “脏页”),而非立即写入磁盘。sync 命令通过调用内核的 sync () 系统函数,强制将这些缓存数据刷新至磁盘,确保修改后的文件内容、元数据(如 inode、目录结构)持久存储 。在执行释放缓存内存操作前,先执行 sync 命令是非常重要的,因为它可以确保内存中的数据已经被安全地写入磁盘,避免在释放缓存时造成数据丢失。
而释放缓存内存的操作则是通过 echo 命令将特定参数写入 /proc/sys/vm/drop_caches 文件来实现的。/proc/sys/vm/drop_caches 是一个内核接口,允许用户空间程序请求清理某些类型的缓存 。具体来说,向该文件写入不同的数值代表不同的缓存清理操作:
- • echo 1 > /proc/sys/vm/drop_caches:仅清除页面缓存(Page Cache),即文件系统缓存,存储从磁盘读取的文件数据。
- • echo 2 > /proc/sys/vm/drop_caches:仅清除目录项缓存(dentries cache)和 inode 缓存,目录项缓存用于加速文件路径解析,inode 缓存存储文件元数据信息。
- • echo 3 > /proc/sys/vm/drop_caches:同时释放上述所有缓存,包括页面缓存、目录项缓存和 inode 缓存 。
例如,要释放所有缓存,可以使用以下命令(需要 root 权限,因此使用 sudo):
sudo sync
sudo echo 3 > /proc/sys/vm/drop_caches
需要注意的是,执行此操作会立即将这些缓存内容从内存中移除,可能导致短期内的性能下降,因为后续的文件访问将需要重新从磁盘加载数据。所以通常,只有在特定情况下(如测试内存使用情况、诊断内存相关问题或在内存压力较大且确定缓存内容不再需要时)才建议执行此操作 。
对比释放前后内存变化
为了更直观地看到释放缓存内存的效果,我们可以在执行释放操作前后使用 free -h 命令查看内存情况。
假设在执行释放缓存命令前,使用 free -h 命令得到如下输出:
total used free shared buff/cache available
Mem: 7.7G 3.1G 1.9G 200M 2.7G 4.3G
Swap: 2.0G 500M 1.5G
此时可以看到,buff/cache 占用了 2.7G 的内存。接着执行释放缓存的命令:
sudo sync
sudo echo 3 > /proc/sys/vm/drop_caches
再次使用 free -h 命令查看内存,得到如下结果:
total used free shared buff/cache available
Mem: 7.7G 3.1G 3.5G 200M 1.1G 4.3G
Swap: 2.0G 500M 1.5G
对比可以发现,释放缓存后,free 内存从 1.9G 增加到了 3.5G,buff/cache 内存从 2.7G 减少到了 1.1G 。这表明释放缓存操作成功地将缓存内存释放出来,增加了系统的可用内存,直观地展示了释放缓存内存对系统内存状态的影响 。通过这种对比,我们能更清晰地了解释放缓存操作在解决服务器内存紧张问题时的实际效果和作用。
排查内存占用进程
当服务器内存出现爆满情况时,除了了解内存的整体使用状况以及释放缓存内存外,还需要进一步排查是哪些进程占用了大量内存,以便采取针对性措施。在 Linux 系统中,有多个命令可以帮助我们完成这一任务。
ps 命令:定位内存占用进程
ps 命令是 Linux 系统中用于报告当前系统进程状态的工具 ,它功能强大,能够提供丰富的进程信息。通过搭配特定选项,我们可以使用 ps 命令查找占用大量内存的进程。
要列出按内存占用降序排列的进程信息,并查看内存占用前 10 的进程,可以使用以下命令:
ps aux --sort=-%mem | head -10
在这个命令中:
- • ps aux:“ps” 是命令本身,“aux” 是选项组合。“a” 表示显示所有终端机下执行的程序,除了阶段作业领导者之外;“u” 是以用户为主的格式来显示程序状况;“x” 表示显示所有程序,不以终端机来区分 。这样可以获取系统中所有进程的详细信息。
- • –sort=-%mem:表示按照内存占用百分比(% MEM)进行降序排列,“-” 号表示降序,若要升序排列则去掉 “-” 号。
- • | head -10:“|” 是管道符,用于将 ps 命令的输出结果作为下一个命令的输入;“head -10” 表示只显示前 10 行结果,这样就能快速定位到内存占用最多的前 10 个进程 。
执行上述命令后,会得到类似如下的输出:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 23456 0.1 5.2 123456 52428 ? Ss 08:00 0:05 /usr/local/bin/application
user1 12345 0.0 3.8 87654 38912 pts/0 S+ 08:10 0:01 /home/user1/script.sh
root 5678 0.2 2.5 56789 25600 ? S 07:50 0:03 /usr/sbin/service_name
输出结果中各字段含义如下:
- • USER:启动该进程的用户。如上述例子中,“root” 表示进程是由 root 用户启动,“user1” 表示由 user1 用户启动。
- • PID:进程 ID,是系统中每个进程的唯一标识 。通过 PID 可以对进程进行各种操作,如终止进程(使用 kill 命令)。
- • %CPU:进程占用的 CPU 百分比,表示该进程在一段时间内使用 CPU 资源的比例 。这里 “23456” 进程的 % CPU 为 0.1,表示它占用了 0.1% 的 CPU 资源。
- • %MEM:进程占用的内存百分比,即该进程使用的内存占系统总内存的比例,这是我们关注的重点字段,用于判断进程对内存的占用情况 。比如 “23456” 进程的 % MEM 为 5.2,说明它占用了 5.2% 的系统内存。
- • VSZ:虚拟内存使用量(Virtual Memory Size),单位是 KB。它表示进程申请的虚拟内存总量,包括进程使用的代码段、数据段、堆、共享库以及映射文件等所占用的内存空间 。该值可能会很大,因为它包含了进程能够访问的所有虚拟地址空间,即使有些内存可能尚未实际分配物理内存 。
- • RSS:常驻内存使用量(Resident Set Size),单位是 KB。它表示进程当前正在使用的、未被交换出去的物理内存量,也就是真正被进程占用的物理内存 。如 “23456” 进程的 RSS 为 52428KB,意味着该进程实际占用了 52428KB 的物理内存。
- • TTY:表示进程运行的终端设备。“?” 表示该进程不是由终端启动的,“pts/0” 表示在伪终端 0 上运行 。
- • STAT:进程状态,常见的状态有 “R”(运行)、“S”(睡眠)、“D”(不可中断睡眠)、“T”(停止)、“Z”(僵尸进程)等 。这里 “23456” 进程的状态为 “Ss”,第一个 “S” 表示睡眠状态,“s” 表示该进程是会话领导者 。
- • START:进程启动的时间。如 “08:00” 表示该进程在 8 点启动。
- • TIME:进程累计使用的 CPU 时间。“0:05” 表示该进程累计使用了 5 秒的 CPU 时间。
- • COMMAND:启动进程的命令。通过该字段可以知道进程对应的具体程序或脚本,如 “/usr/local/bin/application” 表示这是一个位于 “/usr/local/bin” 目录下的名为 “application” 的应用程序 。
通过 ps 命令的这种用法,我们可以快速获取系统中内存占用较高的进程信息,为后续分析和处理内存问题提供重要依据 。
pmap 命令:分析进程内存映射
pmap 命令是 Linux 系统中用于显示指定进程内存映射信息的工具 ,它能够展示进程内存分配的详细情况,帮助我们深入了解进程的内存使用方式。
使用 pmap 命令时,需要指定要分析的进程 ID(PID) 。例如,要查看进程 ID 为 12345 的进程内存映射情况,可以使用以下命令:
pmap 12345
如果希望获得更详细的内存映射信息,包括内存区域的起始地址、大小、实际驻留内存(RSS)、脏页大小以及访问权限等,可以使用 “-x” 选项,以扩展格式显示:
pmap -x 12345
执行 “pmap -x 12345” 命令后,会得到类似如下的输出:
12345: /usr/sbin/sshd
Address Kbytes RSS Dirty Mode Mapping
0000555555554000 4096K 1024K 512K r-x-- /usr/sbin/sshd
0000555555555000 20K 4K 4K rw--- /usr/sbin/sshd
00007ffff7a0d000 16384K 2048K 1024K r-x-- /lib/x86_64-linux-gnu/libc-2.31.so
00007ffff7b0d000 4096K 0K 0K ---p /lib/x86_64-linux-gnu/libc-2.31.so
00007ffff7c0d000 12K 4K 4K r--p /lib/x86_64-linux-gnu/libc-2.31.so
00007ffff7c0e000 4K 4K 4K rw-p /lib/x86_64-linux-gnu/libc-2.31.so
00007ffff7c0f000 132K 128K 128K rw--- [ heap ]
00007ffff7c31000 4K 4K 4K r-x-- [ anon ]
00007ffff7c32000 4K 4K 4K rw--- [ stack ]
下面对输出结果的各字段进行详细解释:
- • 12345: /usr/sbin/sshd:第一行显示了进程的 PID 和进程对应的可执行文件路径,这里表示 PID 为 12345 的进程是 “/usr/sbin/sshd”(SSH 守护进程) 。
- • Address:内存区域的起始地址,用于标识进程内存空间中每个内存段的起始位置,通过它可以判断内存空间的布局 。如 “0000555555554000” 是 “/usr/sbin/sshd” 代码段的起始地址。
- • Kbytes:内存区域的大小,以千字节(KB)为单位,表示该内存段分配的总大小 。“0000555555554000” 这一内存段的大小为 4096KB。
- • RSS:实际驻留内存(Resident Set Size),即该内存区域当前在物理内存中的实际占用量,反映了进程真正占用的物理内存大小 。上述例子中,“0000555555554000” 内存段的 RSS 为 1024KB。
- • Dirty:脏页大小,指被修改但尚未写回磁盘的内存量 。脏页是指内存中已被修改但数据还未同步到磁盘的页面,了解脏页大小对于判断缓存和缓冲区的使用情况有帮助 。“0000555555554000” 内存段的 Dirty 为 512KB。
- • Mode:内存区域的访问权限,常见的权限有 “r-x–”(只读和可执行)、“rw—”(读写)、“—p”(无权限)等 。权限决定了进程对该内存区域的操作方式,如 “0000555555554000” 内存段的权限为 “r-x–”,表示该段可读和可执行,但不可写 。
- • Mapping:该内存区域对应的文件路径或映射描述 。如果是可执行文件或共享库,会显示其路径;如果是堆、栈等内存区域,则会显示对应的描述,如 “[heap]” 表示堆内存,“[ stack ]” 表示栈内存 。通过 Mapping 字段可以清楚地知道每个内存段与哪些文件或内存区域相关联 。
通过 pmap 命令的输出,我们可以全面了解进程的内存使用情况,包括各个内存段的分配大小、实际占用物理内存量、访问权限以及与文件的映射关系等 。这对于排查内存泄漏、分析共享库的加载情况以及优化程序性能等方面都非常有帮助 。例如,如果发现某个进程的堆内存不断增长且没有释放,可能存在内存泄漏问题;或者通过分析共享库的映射情况,判断是否存在不必要的共享库加载,从而进行优化 。总之,pmap 命令是深入分析进程内存使用的有力工具 。
优化内存使用
swap 空间的合理利用
在 Linux 系统中,Swap 空间是一种虚拟内存机制,当物理内存不足时,操作系统会将部分不活跃的内存页写入到磁盘上的 Swap 空间中,从而释放物理内存供当前更需要的进程使用,待这些被交换出去的页再次被需要时,它们又会被重新加载到内存中 。Swap 空间可以是一个专用的磁盘分区,也可以是一个普通文件,挂载后作为 Swap 使用 。
要查看 Swap 空间的使用情况,可以使用以下命令:
- • free -h:前面已经介绍过,它会显示系统的物理内存、Swap 和内核缓冲区的使用情况,在输出中可以找到 Swap 的总量、已使用和剩余空间 。例如:
free -h
- • swapon --show:该命令用于显示当前启用的 Swap 设备或文件的详细信息,包括设备或文件路径、类型、大小、已使用空间和优先级等 。执行命令后输出类似如下:
NAME TYPE SIZE USED PRIO
/swapfile file 2.0G 500M -2
- • cat /proc/swaps:同样能查看当前系统的 Swap 分区或文件的使用情况,输出信息与 swapon --show 类似 。执行后输出示例:
Filename Type Size Used Priority
/swapfile file 2048000 512000 -2
如果服务器的物理内存不足,且 Swap 空间也已经被大量占用,或者根本没有 Swap 空间,那么就需要考虑创建或调整 Swap 空间大小 。下面以创建一个新的 Swap 文件为例,介绍具体步骤:
-
- 创建 Swap 文件:可以使用 fallocate 命令创建一个指定大小的文件作为 Swap 空间,例如创建一个 4GB 大小的 Swap 文件:
sudo fallocate -l 4G /swapfile
其中 “-l” 选项用于指定文件大小,这里设置为 4G 。如果系统不支持 fallocate 命令,也可以使用 dd 命令来创建,不过 dd 命令速度相对较慢 :
sudo dd if=/dev/zero of=/swapfile bs=1M count=4096
这里 “if=/dev/zero” 表示从 /dev/zero 设备读取数据(/dev/zero 是一个特殊设备,会不断返回 0 值字节流),“of=/swapfile” 表示将数据写入到 /swapfile 文件中,“bs=1M” 指定块大小为 1MB,“count=4096” 表示写入 4096 个块,即 4GB 大小 。
- 设置文件权限:确保只有 root 用户可以读写该 Swap 文件,以保证系统安全 。
sudo chmod 600 /swapfile
-
- 格式化 Swap 文件:将创建好的文件格式化为 Swap 文件系统 。
sudo mkswap /swapfile
-
- 启用 Swap 文件:
sudo swapon /swapfile
-
- 设置开机自动挂载:为了使 Swap 文件在系统重启后依然生效,需要将其添加到 /etc/fstab 文件中 。使用文本编辑器打开 /etc/fstab 文件(如使用 sudo nano /etc/fstab),在文件末尾添加一行:
/swapfile none swap sw 0 0
保存并退出编辑器 。
如果需要调整现有 Swap 空间的大小,例如扩大 Swap 文件,可以先使用 swapoff 命令关闭 Swap 文件,然后根据需求调整文件大小(如使用 fallocate -l 新大小 /swapfile),再重新格式化(mkswap /swapfile)并启用(swapon /swapfile) 。缩小 Swap 文件时类似,但需要注意数据安全,确保不会丢失重要数据 。
调整系统内存参数
在 Linux 系统中,通过修改 /etc/sysctl.conf 文件中的内存相关参数,可以优化内存使用,提高系统性能 。该文件是系统内核参数的配置文件,许多内核参数都可以在此文件中进行设置和调整 。
其中,swappiness 是一个重要的内存参数,它控制着系统将内存数据交换到 Swap 空间的倾向程度,取值范围是 0 - 100 。默认情况下,swappiness 的值通常为 60,表示系统在内存紧张时,会有 60% 的倾向将内存数据交换到 Swap 空间 。如果希望系统尽量少使用 Swap 空间,更多地使用物理内存,可以将 swappiness 的值调低 。例如,将其设置为 10,可以通过以下步骤实现:
-
- 临时修改:使用 sysctl 命令可以临时修改 swappiness 的值,立即生效,但系统重启后会恢复默认值 。
sudo sysctl vm.swappiness=10
-
- 永久修改:编辑 /etc/sysctl.conf 文件,添加或修改 vm.swappiness 参数 。使用文本编辑器打开该文件(如 sudo nano /etc/sysctl.conf),添加或修改以下行:
vm.swappiness=10
保存并退出编辑器后,执行以下命令使配置生效:
sudo sysctl -p
“-p” 选项表示从配置文件中加载系统参数,使修改后的参数在系统运行时生效 。通过降低 swappiness 的值,可以减少系统对 Swap 空间的依赖,提高系统性能,尤其是在物理内存相对充足的情况下 。但如果物理内存确实不足,过度降低 swappiness 可能会导致系统因内存不足而频繁出现 OOM(Out-Of-Memory)错误,所以需要根据实际情况进行合理调整 。
除了 swappiness 参数外,/etc/sysctl.conf 文件中还有其他一些与内存相关的重要参数,如 vm.overcommit_memory,它控制着内核内存分配策略 :
- • vm.overcommit_memory=0:这是默认值,采用启发式分配策略 。内核会根据系统的内存使用情况和一些算法来判断是否允许内存分配,在大多数情况下,它可以较好地平衡系统性能和稳定性 。当内存分配请求超过系统当前可用内存时,内核会根据一定的规则进行评估,若认为风险较低则允许分配,否则拒绝 。
- • vm.overcommit_memory=1:表示总是允许超过物理内存的分配 。在这种模式下,内核不会对内存分配进行严格限制,即使系统的物理内存和 Swap 空间都不足,也会尽量满足内存分配请求 。这种设置可能会导致系统在内存不足时出现严重的性能问题甚至崩溃,但在某些特殊场景下,如运行一些对内存需求难以准确预估且希望尽量避免因内存分配失败而导致程序中断的应用时,可能会使用此设置 。
- • vm.overcommit_memory=2:为严格模式,不允许超过 “swap + 物理内存” 总量的内存分配 。它会严格限制内存分配,确保系统不会因为过度分配内存而陷入危险状态,适用于对系统稳定性要求极高的场景 。
同样,修改 vm.overcommit_memory 参数也可以通过临时修改(sysctl -w vm.overcommit_memory=X)和永久修改(编辑 /etc/sysctl.conf 文件并执行 sysctl -p)两种方式 。在实际应用中,需要根据服务器的负载情况、应用需求以及内存配置等因素,谨慎调整这些内存参数,以达到优化内存使用、提升系统性能和稳定性的目的 。
监控与预防内存问题
sar 命令:长期内存监控
sar(System Activity Reporter)命令是 Linux 系统中一个强大的系统性能分析工具 ,它能够长期收集和分析系统的各项性能数据,包括内存使用情况,为系统管理员提供了全面了解系统运行状态的能力 。sar 命令的数据收集是通过一个名为 sadc(System Activity Data Collector)的后台进程实现的 。sadc 进程会按照设定的时间间隔定期收集系统性能数据,并将这些数据写入到系统日志文件中,默认位于 /var/log/sa/ 目录下,日志文件命名格式为 saDD,其中 DD 代表日期 。
sar 命令的基本语法为:
sar [options] [-o filename] interval [count]
其中:
- • options:是可选参数,用于指定要收集和显示的数据类型,如 “-u” 表示 CPU 使用率,“-r” 表示内存使用情况等 。
- • -o filename:表示将命令结果以二进制格式存放在指定的文件中,以便后续分析 。
- • interval:采样间隔时间,单位为秒,必须手动设置 。
- • count:采样次数,是可选参数,默认值为 1 。
要使用 sar 命令定时收集内存数据,例如每 10 分钟收集一次内存使用情况,并将数据保存到 /tmp/memory_data 文件中,可以使用以下命令:
sar -r 600 -o /tmp/memory_data
这里 “-r” 选项用于收集内存使用情况数据,“600” 表示采样间隔为 600 秒(即 10 分钟) 。该命令会持续运行,不断地按照 10 分钟的间隔收集内存数据并保存到 /tmp/memory_data 文件中 。
如果想要查看之前保存的内存数据报表,可以使用 “-f” 选项从指定文件中读取数据并生成报表 。例如,查看刚才保存的 /tmp/memory_data 文件中的内存数据报表:
sar -f /tmp/memory_data
执行上述命令后,会得到类似如下的输出:
Linux 5.4.0-106-generic (server.example.com) 01/01/2024 _x86_64_ (4 CPU)
10:00:00 AM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact
10:10:00 AM 1024000 67108864 98.51 51200 2097152 70778880 99.99 32768000 20971520
10:20:00 AM 819200 67300352 98.75 51200 2199040 70878208 99.99 33554432 21990400
输出结果中各字段含义如下:
- • kbmemfree:空闲内存大小,单位为 KB 。
- • kbmemused:已使用内存大小,单位为 KB 。
- • %memused:内存使用率,已使用内存占总内存的百分比 。
- • kbbuffers:缓冲区内存大小,单位为 KB 。
- • kbcached:缓存内存大小,单位为 KB 。
- • kbcommit:已提交内存大小,单位为 KB,包括物理内存和 Swap 中已使用的内存总量 。
- • %commit:已提交内存占总内存(物理内存 + Swap)的百分比 。
- • kbactive:活跃内存大小,单位为 KB,指最近被访问过的内存 。
- • kbinact:非活跃内存大小,单位为 KB,指较长时间未被访问的内存 。
通过 sar 命令长期监控内存使用情况,我们可以获取系统内存使用的历史数据,分析内存使用趋势,及时发现内存使用异常情况,为系统性能优化和内存问题排查提供有力支持 。
自动化内存监控脚本
除了使用 sar 命令进行长期内存监控外,我们还可以编写简单的 Shell 脚本实现定期检查内存使用率,并在内存使用率超过设定阈值时发送邮件或短信报警,从而实现内存问题的提前预警 。
以下是一个简单的 Shell 脚本示例,用于检查内存使用率并在超过 80% 时发送邮件报警:
#!/bin/bash
# 定义邮件发送相关信息
EMAIL="admin@example.com"
SMTP_SERVER="smtp.example.com"
SMTP_PORT=587
SMTP_USER="your_email@example.com"
SMTP_PASSWORD="your_email_password"
# 获取内存使用率
mem_usage=$(free | grep Mem | awk '{printf "%.1f", $3/$2 * 100}')
# 设置内存使用率阈值
threshold=80
# 检查内存使用率是否超过阈值
if (( $(echo "$mem_usage > $threshold" | bc -l) )); then
# 构建邮件内容
subject="内存使用率过高告警"
body="当前内存使用率已达到 $mem_usage%,超过阈值 $threshold%。请及时检查服务器内存使用情况。"
# 发送邮件
(echo -e "To: $EMAIL
Subject: $subject
$body" | openssl s_client -quiet -tls1_2 -connect $SMTP_SERVER:$SMTP_PORT -starttls smtp -auth login -user $SMTP_USER -pass $SMTP_PASSWORD) &>/dev/null
echo "已发送内存使用率过高告警邮件至 $EMAIL"
else
echo "当前内存使用率为 $mem_usage%,处于正常范围。"
fi
在这个脚本中:
- • 首先定义了邮件发送所需的相关信息,包括收件人邮箱(EMAIL)、SMTP 服务器地址(SMTP_SERVER)、端口号(SMTP_PORT)、发件人邮箱(SMTP_USER)和密码(SMTP_PASSWORD) 。实际使用时,请根据你的邮件服务器和邮箱信息进行修改 。
- • 使用 “free | grep Mem | awk ‘{printf “%.1f”, 2 * 100}’” 命令获取内存使用率,并将结果存储在 mem_usage 变量中 。
- • 设置内存使用率阈值为 80(threshold=80),可根据实际情况调整该阈值 。
- • 通过 “bc -l” 命令比较内存使用率(mem_usage)和阈值(threshold),判断内存使用率是否超过阈值 。如果超过阈值,则构建邮件内容(包括主题和正文),并使用 openssl 命令通过 SMTP 协议发送邮件报警 。
- • 如果内存使用率未超过阈值,则输出当前内存使用率处于正常范围的提示信息 。
为了让这个脚本定期执行,可以将其添加到系统的定时任务(cron)中 。例如,要每 15 分钟执行一次该脚本,可以使用以下命令编辑 cron 任务:
crontab -e
在打开的编辑器中添加以下行:
*/15 * * * * /path/to/your/script.sh
这里 “/path/to/your/script.sh” 是你保存上述脚本的实际路径 。保存并退出编辑器后,系统会按照设定的时间间隔自动执行该脚本,实现对内存使用率的定期监控和报警功能 。
通过这种自动化的内存监控脚本,我们可以实时掌握服务器内存使用情况,在内存问题出现前及时采取措施,避免因内存爆满导致的服务器故障和业务中断,确保服务器的稳定运行 。
案例分析
实际内存爆满案例解析
在某电商公司的线上业务服务器中,曾经出现过一次严重的服务器内存爆满事故。该服务器主要承载着电商平台的核心业务,包括商品展示、用户下单、订单处理等关键功能。
事故发生当天,正值电商平台的促销活动期间,大量用户涌入平台进行购物。起初,运维人员发现网站的响应速度逐渐变慢,页面加载时间从原本的 1 - 2 秒延长至 5 - 10 秒,用户纷纷反馈在浏览商品和操作购物车时出现明显卡顿。随着时间的推移,情况愈发严重,部分用户开始无法正常访问网站,页面直接显示 “502 Bad Gateway” 错误。同时,服务器的 SSH 连接也变得异常缓慢,甚至出现连接超时的情况,运维人员无法正常登录服务器进行管理和排查。
通过初步检查,发现服务器的 CPU 使用率虽然略有上升,但并未达到过高的水平,而内存使用率却飙升至 100%,Swap 空间也被全部占满。这表明内存问题是导致此次事故的关键原因。
解决过程与命令应用
面对这一紧急情况,运维团队迅速展开了排查和解决工作,运用了前面介绍的 10 个 Linux 命令来逐步解决内存爆满问题。
-
- 查看内存使用情况:首先,运维人员使用
free -h命令查看内存状态,发现物理内存和 Swap 空间均已耗尽,可用内存几乎为 0。接着,使用top命令实时监控内存,按下 “M” 键按照内存占用对进程进行排序,发现一个名为 “java -jar application.jar” 的 Java 应用程序进程占用了大量内存,其 “% MEM” 高达 40%,“RES” 达到了 3.5G。这个 Java 应用正是电商平台的核心业务程序,由于促销活动期间业务量激增,该程序可能存在内存泄漏或内存使用不合理的问题,导致内存占用不断攀升。
- 查看内存使用情况:首先,运维人员使用
-
- 释放缓存内存:为了尽快释放一些内存,运维人员先执行了
sudo sync命令,确保内存中的数据已安全写入磁盘,然后执行sudo echo 3 > /proc/sys/vm/drop_caches命令释放所有缓存内存。再次使用free -h命令查看,发现 free 内存从几乎为 0 增加到了 500M,这在一定程度上缓解了内存紧张的局面,但整体内存压力仍然很大。
- 释放缓存内存:为了尽快释放一些内存,运维人员先执行了
-
- 排查内存占用进程:为了进一步确定内存占用情况,运维人员使用
ps aux --sort=-%mem | head -10命令列出内存占用前 10 的进程,除了前面发现的 Java 应用程序进程外,还发现一些数据库相关进程(如mysqld)也占用了较多内存,这可能是由于业务量增加导致数据库查询频繁,内存消耗增大。随后,使用pmap -x 进程ID命令(这里的进程 ID 为 Java 应用程序的进程 ID)分析该 Java 进程的内存映射情况,发现该进程存在大量的内存分配,且一些内存区域的使用效率较低,可能存在内存泄漏点 。
- 排查内存占用进程:为了进一步确定内存占用情况,运维人员使用
-
- 优化内存使用:针对 Swap 空间已被占满的情况,运维人员考虑到当前物理内存确实不足,决定增加 Swap 空间。他们使用
fallocate -l 2G /swapfile命令创建了一个 2G 大小的 Swap 文件,然后依次执行chmod 600 /swapfile设置文件权限、mkswap /swapfile格式化 Swap 文件、swapon /swapfile启用 Swap 文件 。通过swapon --show命令查看,确认新的 Swap 文件已成功启用,这为系统提供了额外的虚拟内存空间,缓解了内存不足的压力 。同时,运维人员编辑/etc/sysctl.conf文件,将vm.swappiness的值从默认的 60 调整为 20,减少系统对 Swap 空间的依赖,提高内存使用效率 。执行sudo sysctl -p使配置生效。
- 优化内存使用:针对 Swap 空间已被占满的情况,运维人员考虑到当前物理内存确实不足,决定增加 Swap 空间。他们使用
-
- 监控内存使用:在进行上述操作的过程中,运维人员持续使用
sar -r 60 10命令定时收集内存数据,以便实时监控内存使用情况的变化。通过分析这些数据,他们可以清楚地看到内存使用率的波动以及各项内存参数的变化趋势,为后续的优化和调整提供依据 。此外,为了防止类似问题再次发生,运维人员编写了一个自动化内存监控脚本。该脚本使用free命令获取内存使用率,并与设定的阈值(如 80%)进行比较。如果内存使用率超过阈值,脚本会通过邮件报警的方式通知运维人员。他们将该脚本添加到系统的定时任务(cron)中,每 15 分钟执行一次,实现了对内存使用情况的实时监控和预警功能 。
- 监控内存使用:在进行上述操作的过程中,运维人员持续使用
经过一系列的排查和优化操作,服务器的内存使用率逐渐下降,最终恢复到正常水平,网站也恢复了正常访问,业务得以稳定运行。这次案例充分展示了在面对服务器内存爆满问题时,合理运用 Linux 命令进行排查和解决的重要性,以及通过优化内存使用和设置监控机制来预防此类问题再次发生的必要性。
总结与建议
回顾 10 个 Linux 命令
在解决服务器内存爆满问题的过程中,我们介绍了 10 个非常实用的 Linux 命令,每个命令都有其独特的作用和适用场景。
- • free -h:用于查看系统内存状态,以人类可读格式展示物理内存、交换空间和内核缓冲区的使用情况,帮助我们快速了解内存的整体使用状况 。
- • top:实时监控系统进程和内存使用,按下 “M” 键可按内存占用排序,方便定位内存占用大户 。
- • sync:确保内存缓冲区数据写入磁盘,防止数据丢失,在释放缓存内存前必须执行 。
- • echo 1/2/3 > /proc/sys/vm/drop_caches:释放页面缓存(1)、目录项和 inode 缓存(2)或所有缓存(3),在内存紧张时释放缓存内存,增加可用内存 。
- • ps aux --sort=-%mem | head -10:列出按内存占用降序排列的进程信息,查看内存占用前 10 的进程,快速定位内存占用较高的进程 。
- • pmap -x 进程 ID:分析指定进程的内存映射情况,展示内存分配详细信息,深入了解进程内存使用方式 。
- • swapon --show:查看 Swap 空间使用情况,包括设备或文件路径、类型、大小、已使用空间和优先级等 。
- • fallocate -l 大小 /swapfile:创建指定大小的 Swap 文件,用于增加 Swap 空间,缓解物理内存不足的压力 。
- • sysctl -w vm.swappiness=X:临时修改 swappiness 值,控制系统将内存数据交换到 Swap 空间的倾向程度,优化内存使用 。
- • sar -r 间隔时间 -o 文件名:定时收集内存数据,长期监控内存使用情况,为性能优化和问题排查提供依据 。
日常运维建议
为了避免服务器内存爆满问题的发生,在日常服务器运维中,我们可以采取以下预防措施,建立良好的运维习惯 :
- • 定期清理缓存:按照一定的时间周期(如每周或每月)执行释放缓存内存的操作,及时释放被缓存占用的内存空间,确保系统有足够的可用内存 。同时,对于一些应用程序的缓存,也应根据其特点和使用情况进行定期清理或优化 。
- • 优化应用程序内存使用:对服务器上运行的应用程序进行定期检查和优化 。审查应用程序的代码,查找并修复可能存在的内存泄漏问题;优化应用程序的算法和数据结构,减少不必要的内存占用;合理配置应用程序的内存参数,根据服务器的实际内存资源和应用程序的业务需求,设置合适的堆内存大小、线程栈大小等参数 。
- • 合理设置内存参数:根据服务器的硬件配置和业务负载情况,谨慎调整系统内存参数 。例如,根据物理内存的实际使用情况和业务对内存的需求,合理设置 swappiness 的值,平衡物理内存和 Swap 空间的使用;对于 vm.overcommit_memory 参数,要根据应用程序的特点和对系统稳定性的要求,选择合适的内存分配策略 。
- • 实时监控内存使用:利用 sar 命令、自动化监控脚本以及专业的服务器监控工具,实时监控服务器内存的使用情况 。设置合理的内存使用率阈值,当内存使用率接近或超过阈值时,及时发出警报通知运维人员 。通过实时监控,能够及时发现内存使用异常情况,提前采取措施进行处理,避免内存爆满问题的发生 。
- • 优化业务流程:从业务层面出发,对服务器所承载的业务流程进行优化 。例如,对于一些高并发的业务场景,通过合理的负载均衡、缓存策略和异步处理机制,减少对服务器内存的瞬间压力;对于一些长时间运行且占用大量内存的任务,考虑进行分阶段处理或优化算法,降低内存的持续占用 。
通过熟练掌握和运用上述 10 个 Linux 命令,并遵循这些日常运维建议,我们能够更有效地管理服务器内存,预防和解决内存爆满问题,确保服务器的稳定、高效运行,为业务的正常开展提供坚实的基础 。
学习资源
如果你是也准备转行学习网络安全(黑客)或者正在学习,这里开源一份360智榜样学习中心独家出品《网络攻防知识库》,希望能够帮助到你
知识库由360智榜样学习中心独家打造出品,旨在帮助网络安全从业者或兴趣爱好者零基础快速入门提升实战能力,熟练掌握基础攻防到深度对抗。

1、知识库价值
深度: 本知识库超越常规工具手册,深入剖析攻击技术的底层原理与高级防御策略,并对业内挑战巨大的APT攻击链分析、隐蔽信道建立等,提供了独到的技术视角和实战验证过的对抗方案。
广度: 面向企业安全建设的核心场景(渗透测试、红蓝对抗、威胁狩猎、应急响应、安全运营),本知识库覆盖了从攻击发起、路径突破、权限维持、横向移动到防御检测、响应处置、溯源反制的全生命周期关键节点,是应对复杂攻防挑战的实用指南。
实战性: 知识库内容源于真实攻防对抗和大型演练实践,通过详尽的攻击复现案例、防御配置实例、自动化脚本代码来传递核心思路与落地方法。
2、 部分核心内容展示
360智榜样学习中心独家《网络攻防知识库》采用由浅入深、攻防结合的讲述方式,既夯实基础技能,更深入高阶对抗技术。

360智榜样学习中心独家《网络攻防知识库》采用由浅入深、攻防结合的讲述方式,既夯实基础技能,更深入高阶对抗技术。
内容组织紧密结合攻防场景,辅以大量真实环境复现案例、自动化工具脚本及配置解析。通过策略讲解、原理剖析、实战演示相结合,是你学习过程中好帮手。
1、网络安全意识

2、Linux操作系统

3、WEB架构基础与HTTP协议

4、Web渗透测试

5、渗透测试案例分享

6、渗透测试实战技巧

7、攻防对战实战

8、CTF之MISC实战讲解

3、适合学习的人群
一、基础适配人群
- 零基础转型者:适合计算机零基础但愿意系统学习的人群,资料覆盖从网络协议、操作系统到渗透测试的完整知识链;
- 开发/运维人员:具备编程或运维基础者可通过资料快速掌握安全防护与漏洞修复技能,实现职业方向拓展或者转行就业;
- 应届毕业生:计算机相关专业学生可通过资料构建完整的网络安全知识体系,缩短企业用人适应期;
二、能力提升适配
1、技术爱好者:适合对攻防技术有强烈兴趣,希望掌握漏洞挖掘、渗透测试等实战技能的学习者;
2、安全从业者:帮助初级安全工程师系统化提升Web安全、逆向工程等专项能力;
3、合规需求者:包含等保规范、安全策略制定等内容,适合需要应对合规审计的企业人员;
因篇幅有限,仅展示部分资料,完整版的网络安全学习资料已经上传CSDN,朋友们如果需要可以在下方CSDN官方认证二维码免费领取【保证100%免费】
;
因篇幅有限,仅展示部分资料,完整版的网络安全学习资料已经上传CSDN,朋友们如果需要可以在下方CSDN官方认证二维码免费领取【保证100%免费】

文章来自网上,侵权请联系博主







