You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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完全对齐:

  1. 轻量级进程(线程)的所有物理内存驻留页已被换出到交换分区,驻留内存大小为0
  2. 线程当前处于等待资源就绪的睡眠状态,而非运行、僵尸、停止状态

方法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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 13:51:29