LOAD高但是CPU和IO都很低问题


现象:

执行w命令,查看load情况


使用sar命令查看,CPU和load都不高


查看进程状态

top 然后执行shift+o,进入排序页面


键入 w字母(表示按照进程状态排序),回车,然后键入R


猜测由于nfs导致问题,执行:df -h


看到有网络文件系统。

查看了一些资料,涉及进程的D状态:  uninterruptible sleep (不可打断的睡眠状态)

[1] http://www.dewen.io/q/5664

上图阐释了一个进程运行的情况,首先,运行的时候,进程会向内核请求一些服务,内核就会将程序挂起进程,并将进程放到parked队列,通常这些进程只会在parked队列中停留很短的时间,在ps(1)列表中是不会出现的。但是如果内核因为某些原因不能提供相应服务的话。例如,进程要读某一个特定的磁盘块,但是磁盘控制器坏了,这时,除非进程完成读磁盘,否则内核无法将该进程移出parked队列,此时该进程标志位就会被置为D。由于进程只有在运行的时候才能接受到signals,所以此时在parked队列上的进程也就无法接收到信号了。解决这个问题的方法要么是给资源给该进程,要么是reboot
通俗一点说,产生D状态的原因出现uninterruptible sleep状态的进程一般是因为在等待IO,例如磁盘IO、网络IO等。在发出的IO请求得不到相应之后,进程一般就会转入uninterruptible sleep状态,例如若NFS服务端关闭时,如果没有事先amount相关目录。在客户端执行df的话就会挂住整个会话,再用ps axf查看的话会发现df进程状态位已经变成D。

[2] http://blog.kevac.org/2013/02/uninterruptible-sleep-d-state.html 

Sometimes you will see processes on your linux box that are in D state as shown by ps, top, htop or similar. D means uninterruptible sleep. As opposed to normal sleep, you can't do anything with these processes (i.e. kill them).

[3]http://blog.xupeng.me/2009/07/09/linux-uninterruptible-sleep-state/

ps 的手册里说 D 状态是 uninterruptible sleep,Linux 进程有两种睡眠状态,一种 interruptible sleep,处在这种睡眠状态的进程是可以通过给它发信号来唤醒的,比如发 HUP 信号给 nginx 的 master 进程可以让 nginx 重新加载配置文件而不需要重新启动 nginx 进程;另外一种睡眠状态是 uninterruptible sleep,处在这种状态的进程不接受外来的任何信号,这也是为什么之前我无法用 kill 杀掉这些处于 D 状态的进程,无论是 killkill -9 还是 kill -15,因为它们压根儿就不受这些信号的支配。

进程为什么会被置于 uninterruptible sleep 状态呢?处于 uninterruptible sleep 状态的进程通常是在等待 IO,比如磁盘 IO,网络 IO,其他外设 IO,如果进程正在等待的 IO 在较长的时间内都没有响应,那么就很会不幸地被 ps 看到了,同时也就意味着很有可能有 IO 出了问题,可能是外设本身出了故障,也可能是比如挂载的远程文件系统已经不可访问了,我这里遇到的问题就是由 down 掉的 NFS 服务器引起的。

正是因为得不到 IO 的相应,进程才进入了 uninterruptible sleep 状态,所以要想使进程从 uninterruptible sleep 状态恢复,就得使进程等待的 IO 恢复,比如如果是因为从远程挂载的 NFS 卷不可访问导致进程进入 uninterruptible sleep 状态的,那么可以通过恢复该 NFS 卷的连接来使进程的 IO 请求得到满足,除此之外,要想干掉处在 D 状态进程就只能重启整个 Linux 系统了。

[4]http://www.orczhou.com/index.php/2010/05/how-to-kill-an-uninterruptible-sleep-process/

这个是最详细的,但是也很难理解;为什么IO的uninterruptible sleep会导致load变高呢?

进入该状态的进程,会一直等待NFS,不接受任何信号,当然也就无法被杀死(kill/fuser -k)。因为进程一直在运行队列(running queue)中,所以还会导致主机的Load上升(虽然主机并不繁忙)。如果由于这个原因被卡住的进程很多的话,主机的Load可能会看起来非常高。

引出来一个问题就是,为什么IO问题会导致load变高,这个 running queue在哪里可以看到呢?uninterruptible sleep状态的进程为什么会使load变高?



<think>嗯,用户想知道如何区分系统卡顿是由于内存瓶颈还是CPU瓶颈引起的。这个问题我之前了解过一些,但需要仔细想想具体的方法指标。首先,我得回忆一下内存CPU在系统中的作用,以及它们出现瓶颈时的同表现。 内存瓶颈通常内存足有关,比如当物理内存够时,系统会使用交换空间(swap),导致频繁的页面交换(swapping),这会增加磁盘I/O,进而导致卡顿。而CPU瓶颈则是处理器资源被耗尽,任务需要等待CPU时间片,导致负载。 接下来,需要确定用户可能关心的指标。对于内存,常用的指标有可用内存量、swap使用率、页面错误(page faults)、kswapd进程的活动等。而CPU方面,则关注CPU使用率、负载平均值(load average)、上下文切换(context switches)运行队列长度(run queue length)。 然后,工具方面,Linux系统常用的有top、vmstat、free、sar等。比如,使用top命令可以实时查看CPU内存的使用情况。vmstat可以显示内存、swap、IOCPU的信息。free命令显示内存总量可用内存。sar工具则可以收集系统活动信息,帮助分析历史数据。 在分析过程中,如果发现swap使用率,页面错误频繁,kswapd进程活跃,可能说明内存足。这时候系统可能因为频繁的内存回收页面交换导致卡顿。而CPU方面,如果用户态(us)内核态(sy)的CPU使用率长时间超过80%,或者负载平均值远CPU核心数,可能意味着CPU瓶颈。 另外,还需要考虑两者的相互影响。比如,内存足导致频繁的页面交换,这会增加磁盘I/O,而I/O等待时间(wa)也会占用CPU资源,使得CPU使用率看起来很,但其实问题根源在内存。这时候需要结合多个指标来判断,比如wa值可能提示I/O等待,进而关联到内存交换。 还有用户提到的引用内容,比如引用[1]提到kswapd0频繁唤醒会导致CPU占用,这可能是内存足的表现。但这时候CPU使用率其实是内存问题导致的,所以需要综合判断。引用[3]提到的异步日志可能影响内存使用,但这里可能更多是日志处理的问题过用户的问题主要在于区分内存CPU瓶颈,所以重点还是在监控工具指标上。 最后,可能需要给出具体的步骤,比如先用top查看CPU内存使用情况,再用vmstat查看内存交换CPU的wa指标,结合free看swap使用量。如果发现swap使用,同时有大量页面换入换出,那么内存瓶颈可能性大。如果CPU使用率持续位,而内存swap使用正常,则可能是CPU问题。另外,像内存泄漏的问题会导致可用内存逐渐减少,可以通过监控内存使用趋势来识别。 还要注意其他指标,比如上下文切换过多可能说明进程频繁切换,消耗CPU资源,但这也可能是由于内存足导致进程被频繁挂起唤醒。这时候需要查看上下文切换的次数CPU使用分布,比如incs的值。 总结下来,区分两者的关键在于监控多个指标,分析它们的趋势相互关系,使用合适的工具进行实时历史数据的收集,从而确定卡顿的根本原因是内存还是CPU。</think>### 区分内存瓶颈与CPU瓶颈导致卡顿的方法及指标 #### 一、核心观察指标 1. **内存瓶颈特征** - **可用内存(Available Memory)**:低于总内存的10%时可能触发内存回收机制[^1] - **Swap使用率**:若`Swap`使用量持续增长,说明物理内存足,触发页面交换 - **页面错误(Page Faults)**:`vmstat`中`pgmajfault/s`(主要缺页中断)表示频繁从磁盘换入页面 - **kswapd活动**:内核线程`kswapd0`的CPU占用率过(通过`top`查看) 2. **CPU瓶颈特征** - **CPU使用率**:用户态(`us`)内核态(`sy`)总超过80% - **负载平均值(Load Average)**:1分钟/5分钟负载值远CPU核心数(如4核CPU负载>8) - **上下文切换(Context Switches)**:`vmstat`中`cs`值过(>10万次/秒)表示进程频繁切换 - **运行队列长度(Run Queue)**:`vmstat`中`r`列数值表示等待CPU的任务堆积 #### 二、诊断工具及方法 1. **实时监控工具** - **`top`命令**: - 内存视角:关注`MiB Mem`的`free`值`MiB Swap`的`used`值 - CPU视角:观察`%Cpu(s)`行的`us`(用户态)、`sy`(内核态)、`wa`(I/O等待) ```bash top -d 1 -n 60 # 每秒刷新,持续60秒 ``` - **`vmstat`命令**: ```bash vmstat 1 5 # 每秒采样,共5次 ``` 关键字段: - `si`(Swap In)、`so`(Swap Out)非零表示内存足 - `us`+`sy`>80%为CPU瓶颈 - `wa`(I/O等待)可能由内存交换引发 2. **历史数据分析** - **`sar`工具**: ```bash sar -r 1 3 # 内存使用历史 sar -u 1 3 # CPU使用历史 ``` - **`free`命令**: ```bash free -h -s 2 # 每2秒显示内存状态 ``` #### 三、典型场景对比 | **场景** | **内存瓶颈** | **CPU瓶颈** | |----------------|-----------------------------------|--------------------------------| | **Swap活动** | `si`/`so`持续>0,`Swap`使用率上升 | 通常无显著Swap活动 | | **进程状态** | 大量进程处于`D`(可中断睡眠)状态 | 进程`R`(运行)状态占比 | | **I/O等待** | `wa`值伴随`si`/`so`同步升 | `wa`低但`us`/`sy` | | **内核线程** | `kswapd0`线程CPU占用率[^1] | `ksoftirqd`或调度线程活跃 | #### 四、优化方向建议 - **内存优化**: - 减少内存泄漏(通过`valgrind`检测)[^2] - 调整内存回收策略(如`vm.swappiness`参数) - 使用异步I/O减少内存压力(如日志异步写入)[^3] - **CPU优化**: - 排查CPU线程(`top -H`定位线程) - 优化算法复杂度或引入并发处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值