暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

瞬间了解 Linux Swap 内存占用情况

数据库驾驶舱 2024-06-26
114

「什么是 Swap 内存?」

Swap 是一种在硬盘上分配的空间,用来存储那些当前不在使用中的内存数据。当物理内存(RAM)不足时,系统会将一部分内存数据交换到 Swap 中,从而释放出更多的物理内存以供其他应用使用。这种机制虽然会降低性能,但在物理内存不足的情况下,可以有效防止系统崩溃。

监控 Swap 内存占用情况对于系统管理非常重要,主要原因包括:

  1. 「发现内存瓶颈」:如果 Swap 使用率过高,可能意味着物理内存不足,需要增加物理内存或优化应用程序的内存使用。

  2. 「防止性能下降」:过多的 Swap 使用会导致磁盘 I/O 增加,从而降低系统性能。及时发现和处理可以提高系统响应速度。

  3. 「诊断系统问题」: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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论