如何在Linux系统获取Solaris vmstat w列对应的换出LWP数量
Linux下获取等价Solaris vmstat w列指标的方法
背景说明
- Solaris平台执行
vmstat | head -3时,kthr分类下的w字段统计维度为:等待处理资源完成、已被换出的轻量级进程(LWPs)数量,是常用的系统监控指标 - RedHat Linux发行版自带的procps-ng版本
vmstat无该字段,已验证的top运行进程数、ps -efL输出的NLWP字段均不匹配该指标语义
可用统计方法
Linux 2.6及之后内核版本没有内置该指标的直接输出,但可以通过内核暴露的运行态数据聚合得到完全等价的统计值,核心判定逻辑和Solaris完全对齐:
- 轻量级进程(线程)的所有物理内存驻留页已被换出到交换分区,驻留内存大小为0
- 线程当前处于等待资源就绪的睡眠状态,而非运行、僵尸、停止状态
方法1:基于/proc文件系统的精确统计
执行以下命令可得到实时准确值:
count=0 for task_status in /proc/[0-9]*/task/*/status; do # 跳过已退出进程的临时文件 [ -f "$task_status" ] || continue read state rss <<< $(awk '/^State:/ {s=$2} /^VmRSS:/ {r=$2} END {print s, r}' "$task_status") if [ "$rss" -eq 0 ] && [[ "$state" =~ [DS] ]]; then ((count++)) fi done echo $count
方法2:ps命令快速统计
不需要遍历proc文件的话,可以直接用ps的格式化输出过滤统计,执行效率更高:
ps -eLo state,rss | awk '$2 == 0 && $1 ~ /[DS]/ {cnt++} END {print cnt+0}'
命令说明:
-eL参数枚举系统所有轻量级进程(线程)- 过滤条件为驻留内存
rss为0、状态为D(不可中断睡眠,等待IO/内核资源)或S(可中断睡眠,等待事件资源)的线程,最终计数即为目标值
常见误区说明
- 不要用
vmstat的b列做替代:该列统计的是处于不可中断睡眠状态的进程总数,不管是否被换出,数值远大于目标指标 - 不要用
top的运行队列长度做替代:该值统计的是正在CPU运行+等待CPU调度的任务数,和换出等待的LWP逻辑完全无关 - 不要用
NLWP字段做替代:该值是单个进程关联的线程总数,无状态、换出维度的筛选,完全不匹配需求
内容的提问来源于stack exchange,提问作者kldd
相关产品推荐
相关产品推荐

