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

解析Linux进程中D状态及解决方法
本文深入探讨了Linux进程中D状态的含义及其产生的原因,详细解释了D状态表示进程处于不可打断的睡眠状态,并提供了针对不同原因导致的D状态的解决策略,特别是与NFS服务中断相关的具体解决方案。


现象:

执行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>首先,用户的问题是:“我想查找tpcc-mysql测试时CPU使用率很低的原因及解决办法”。这是基于之前的引用内容,我需要参考这些引用来分析。 回顾引用: - 引用[1]:提到TPC-C测试在腾讯云1核2G内存机子上表现糟糕,数据库未调优。 - 引用[2]:比较MySQL其他系统的性能,但提到CPU效率节约一半。 - 引用[3]:描述某公司进行TPC-C测试的环境方法。 - 引用[4]:讨论TPCC测试的约束目标,以及删除库重新导入数据以再次测试。 用户的主要疑问是:在tpcc-mysql测试中,CPU使用率很低的原因解决方法。我需要基于这些引用一般知识来回答。 关键点: - CPU使用率低意味着数据库没有充分利用处理器资源,可能导致性能瓶颈在其他地方。 - 在TPC-C测试中,CPU使用率低可能的原因: - I/O瓶颈:磁盘读写慢,CPU空闲等待。 - 锁竞争:如锁冲突导致线程阻塞。 - 配置问题:如MySQL参数设置当(如线程池、缓冲区大小)。 - 测试工具或环境限制:如虚拟机资源限制。 - 数据量小:测试数据足,导致负载低。 从引用[1]:提到“腾讯云1核2G内存机子怎么给力”“数据库没有经过任何调优”,暗示资源受限配置问题可能影响性能。 引用[4]:提到需要删除库重新导入数据以确保测试状态OK,这暗示数据准备的重要性。 因此,原因可能包括: 1. I/O瓶颈:磁盘慢,CPU等待。 2. 内存足:缓冲池小,导致频繁磁盘访问。 3. 配置当:如innodb_buffer_pool_size太小。 4. 并发设置:如测试工具并发线程数少。 5. 环境因素:虚拟机或云实例限制CPU资源。 解决方法: 1. 调优MySQL: - 增加缓冲池大小(innodb_buffer_pool_size)。 - 优化查询索引(引用[4]提到表索引数据)。 2. 检查I/O: - 使用SSD磁盘。 - 优化磁盘配置。 3. 增加负载: - 确保数据量足够(引用[3]提到10个仓库)。 - 调整BenchmarkSQL或tpcc-mysql的并发用户数。 4. 环境优化: - 使用更CPU内存的服务器。 - 确保操作系统设置优化。 5. 监视分析: - 使用工具如vmstat、iostat监视CPUI/O。 - 查看MySQL慢查询日志。 回答结构: - 系统指令要求:使用中文,行内数学用$...$,独立公式用$$...$$(如果需要),生成相关问题。 - 回答清晰可靠。 - 末尾添加引用标识。 生成相关问题: - 根据用户查询,生成相关的问题,如如何调优MySQL等。 最终回答结构: 1. 解释原因。 2. 提供解决方法。 3. 结尾添加相关问题。 4. 自然地添加引用标识。 例如: 原因可能包括[^1][^4]... 解决方法:... §§相关问题§§ 1. ... 2. ... 3. ... </think>### tpcc-mysql测试时CPU使用率低的原因及解决方法 在tpcc-mysql测试中,CPU使用率低通常表示数据库未能充分利用硬件资源,导致性能瓶颈。这会影响测试结果,如TPS(每秒事务数)降低。基于引用内容实践经验,以下是主要原因解决方法: #### 一、CPU使用率低的原因 1. **I/O瓶颈导致CPU空闲**: - 磁盘读写速度慢(如使用HDD而非SSD),CPU等待I/O操作完成而空闲[^1][^4]。 - 数据加载或查询时频繁访问磁盘,而非内存缓存。 2. **MySQL配置当**: - **缓冲池过小**:如`innodb_buffer_pool_size`设置太小,无法缓存热点数据,增加磁盘I/O压力[^1]。 - **并发参数合理**:如`innodb_thread_concurrency`或`thread_cache_size`过低,限制了并发处理能力。 - **日志写入延迟**:`innodb_flush_log_at_trx_commit=1`(默认)确保数据安全但增加I/O开销,CPU利用率下降。 3. **测试环境限制**: - 资源足:如引用[1]所述,1核2G内存的云服务器(如腾讯云)无法处理负载[^1]。 - 虚拟机CPU配额限制:云环境可能限制vCPU性能。 - 数据量足:引用[3]提到TPC-C需要足够仓库数量(如10个),数据量小导致负载过低[^3]。 4. **测试工具或方法问题**: - 并发用户数设置过低:BenchmarkSQL或tpcc-mysql的并发线程数足。 - 数据未正确初始化:引用[4]强调需重新导入表索引数据,否则约束检查失败(如业务占比达标)[^4]。 5. **锁竞争或索引缺失**: - 行锁或表锁冲突导致事务阻塞,CPU空闲等待。 - 缺少优化索引,查询扫描大量数据,增加I/O而非CPU计算负载。 #### 二、解决方法 通过调优MySQL参数、优化环境测试方法,可提升CPU利用率: 1. **优化MySQL配置**: - **增大缓冲池**:调整`innodb_buffer_pool_size`为可用内存的70-80%。例如,16GB内存服务器设置为: ``` innodb_buffer_pool_size = 12G ``` - **调整并发参数**: ``` innodb_thread_concurrency = 0 # 自动适配CPU核心数 thread_cache_size = 16 # 减少线程创建开销 ``` - **平衡日志写入**:改为`innodb_flush_log_at_trx_commit=2`(牺牲部分持久性提升性能)。 2. **解决I/O瓶颈**: - 使用SSD磁盘替代HDD。 - 启用`innodb_io_capacity``innodb_io_capacity_max`,匹配磁盘IOPS能力。 3. **优化测试环境**: - **升级硬件**:选择更核数(如8核CPU大内存的实例(引用[3]中8核16GB环境)[^3]。 - **确保数据充足**:按TPC-C标准生成足够仓库(如50+),参考引用[4]重新导入数据: ```bash # 删除旧库并重新初始化 mysqladmin drop tpcc ./tpcc_load localhost tpcc user password 10 # 10个仓库 ``` 4. **调整测试参数**: - 增加并发用户数(如BenchmarkSQL的`-c`参数从50增至100)。 - 监视实时负载:使用`vmstat`或`iostat`观察CPU磁盘使用: ```bash iostat -dx 2 # 每2秒显示磁盘I/O ``` 5. **数据库索引优化**: - 分析慢查询日志(`slow_query_log=1`),为频查询添加索引。 - 确保TPC-C表索引完整(引用[4]强调索引数据状态必须OK)[^4]。 #### 三、验证效果 - **调优后测试**:重新运行tpcc-mysql,监视CPU使用率(如`top`命令)。理想状态下,CPU利用率应接近70-90%。 - **参考案例**:引用[2]显示,优化后TDSQL-C MySQL的CPU效率可提升近50%[^2]。 如果调整后仍无改善,检查操作系统层限制(如ULIMIT)或云服务配额。定期优化能显著提升测试准确性[^1][^3][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值