「什么是 Swap 内存?」
Swap 是一种在硬盘上分配的空间,用来存储那些当前不在使用中的内存数据。当物理内存(RAM)不足时,系统会将一部分内存数据交换到 Swap 中,从而释放出更多的物理内存以供其他应用使用。这种机制虽然会降低性能,但在物理内存不足的情况下,可以有效防止系统崩溃。
监控 Swap 内存占用情况对于系统管理非常重要,主要原因包括:
「发现内存瓶颈」:如果 Swap 使用率过高,可能意味着物理内存不足,需要增加物理内存或优化应用程序的内存使用。
「防止性能下降」:过多的 Swap 使用会导致磁盘 I/O 增加,从而降低系统性能。及时发现和处理可以提高系统响应速度。
「诊断系统问题」:Swap 内存的异常使用可能是某些系统问题的征兆,如内存泄漏等。
下面是一键查询swap占用脚本
check_swap.sh
#!/bin/bash
# 初始化总Swap使用量为0
SUM=0
# 打印列标题
printf "%s\t%s\t%s\n" "PID" "SwapUsed" "ProcName"
# 为了排序,我们将移除初始的直接echo输出,改为先存储到一个数组中
declare -a process_info
# 遍历/proc目录下的每个数字目录(代表一个进程)
for pid in $(ls /proc/ | grep -E '^[0-9]+$')
do
# 检查swap文件是否存在
if [ -f /proc/$pid/smaps ]; then
# 计算每个进程的Swap使用量
SWAP=$(grep Swap /proc/$pid/smaps | awk '{ sum+=$2 } END { print sum }')
SWAP=${SWAP:-0} # 如果SWAP是空的,将其设置为0
# 如果Swap使用量大于0,则存储相关信息
if [ $SWAP -gt 0 ]; then
# 获取进程名称
PROCNAME=$(ps -p $pid -o comm=)
# 存储进程ID,Swap使用量和进程名称到数组
process_info+=("$(printf "%s\t%s\t\t%s" "$pid" "$SWAP" "$PROCNAME")")
# 累加总Swap使用量
SUM=$(($SUM+$SWAP))
fi
fi
done
# 输出并排序所有收集到的进程信息,按照Swap使用量降序
printf "%s\n" "${process_info[@]}" | sort -t $'\t' -k2,2nr
# 打印总Swap使用量
printf "Total Swap Used: %s KB\n" "$SUM"
# 结果示例:
sh check_swap.sh
PID SwapUsed ProcName
6284 1222896 mysqld
781 260068 rsyslogd
953 38376 salt-minion
780 14592 salt-minion
777 10800 tuned
470 5176 polkitd
563 3380 NetworkManager
776 928 sshd
799 916 zabbix_agentd_n
798 896 zabbix_agentd_n
792 784 zabbix_agentd_n
1 752 systemd
794 732 zabbix_agentd_n
795 716 zabbix_agentd_n
796 716 zabbix_agentd_n
797 716 zabbix_agentd_n
433 536 systemd-udevd
565 524 crond
27246 436 crond
479 336 dbus-daemon
1165 320 mysqld_safe
402 184 systemd-journal
562 144 systemd-logind
492 136 acpid
968 128 agetty
969 128 agetty
Total Swap Used: 1565316 KB
下面是查询实际内存占用
内存段中的“Pss”(Proportional Set Size),它提供了一个进程中分页的平均消耗内存量的估计,其中共享库内存的消耗根据共享的进程数进行了分配。
check_mem.sh
#!/bin/bash
declare -a process_info
total_pss=0
echo -e "PID\tPss(KB)\tCommand"
for pid in $(ls /proc/ | grep -E '^[0-9]+$')
do
if [ -f /proc/$pid/smaps ]; then
pss=$(awk '/Pss:/ {sum += $2} END {print sum}' /proc/$pid/smaps)
pss=${pss:-0}
total_pss=$(($total_pss + $pss))
if [ $pss -gt 0 ]; then
PROCNAME=$(ps -p $pid -o comm=)
process_info+=("$(printf "%d\t%d\t%s" "$pid" "$pss" "$PROCNAME")")
fi
fi
done
printf "%s\n" "${process_info[@]}" | sort -t$'\t' -k2 -nr | head -n 20
echo "Total Pss: $total_pss KB"
total_mem=$(free -m | awk '/Mem:/ {print $2}')
echo "Total System Memory: $total_mem MB"
# 结果示例:
PID Pss(KB) Command
6623 878053 java
23534 582374 clickhouse-serv
21170 511511 node
5738 276730 mongod
18793 136360 ssc
9910 132645 pgpool
753 74077 ssc
31641 71616 redis-server
22409 47230 postgres
982 37050 salt-minion
22412 28503 postgres
747 13787 salt-minion
23533 13357 clckhouse-watch
746 12148 tuned
22414 11224 postgres
500 11041 polkitd
368 7958 systemd-journal
752 6017 rsyslogd
22413 3209 postgres
520 2903 NetworkManager
Total Pss: 2893086 KB
Total System Memory: 15884 MB
「欢迎关注我们的公众号,获取更多技术分享与经验交流。」
文章转载自数据库驾驶舱,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




