转载于http://blogold.chinaunix.net/u1/43502/index.html
很多时候发现linux系统输入一些命令很慢,用top查看IOwait占用CPU很高,top下面列出的进程中,不论按cpu排序、内存排序、时间排序,都看不出来到底哪个进程(哪个分区)占用ipwait最高。
Waiting
CPU花费在等待I/O操作上的总时间,与blocked相似,一个系统不应该花费太多的时间在等待I/O操作上,否则你应该进一步检测I/O子系统是否存在瓶颈。
|
那么到底怎么知道是哪个进程导致iowait过高?
系统日志是没有记录这些内容的,但是内核中有相应的方式。
Linux 内核里提供了一个 block_dump 参数用来把 block 读写(WRITE/READ)状况 dump 到日志里,这样可以通过 dmesg 命令来查看。
看一下介绍
block_dump enables block I/O debugging when set to a nonzero value.Ifyou
want to findoutwhich process caused the disk to spin up(see /proc/sys/vm/laptop_mode),you
can gather information by setting the flag.
Whenthisflag
is set,Linux reports all disk readandwrite operations that take
place,andall block dirtyings done to files.Thismakes
it possible to debug why a disk needs to spin up,andto increase battery
life even more.The outputofblock_dump is written to the kernel
output,andit can be retrieved using"dmesg".When
you use block_dumpandyour kernel logging level also includes kernel debugging messages,you
probably want to turn off klogd,otherwise the outputofblock_dump
will be logged,causing disk activity that isnotnormally there.
|
我们首先想个办法让iowait上来,可以用dd,也可以用cp,下面一个简单的脚本:
[root@fan3838
tmp]#cat a.sh
#!/bin/bash whiletrue
do <wbr><wbr>cd /usr/share<br><wbr><wbr>mkdir doc1<br><wbr><wbr>cp<span style="word-wrap:normal; word-break:normal; line-height:18px; color:rgb(0,0,204)">-</span>ra doc/<span style="word-wrap:normal; word-break:normal; line-height:18px; color:rgb(0,0,204)">*</span>doc1/<br><wbr><wbr>rm<span style="word-wrap:normal; word-break:normal; line-height:18px; color:rgb(0,0,204)">-</span><span style="word-wrap:normal; word-break:normal; line-height:18px; color:rgb(255,0,0)">rf</span>doc1<br>
done</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
[root@fan3838
tmp]#./a.sh &
|
如果使用block_dump那么需要关闭syslog,否则klog会打印很多日志到messages中,这样更加让系统不堪重负。
打开block dump:
echo 1 > /proc/sys/vm/block_dump
|
统计方法:
[root@fan3838 tmp]#dmesg | egrep "READ|WRITE|dirtied" | egrep -o '([a-zA-Z]*)' | sort | uniq -c | sort -rn | head <wbr><wbr>1675 kjournald<br><wbr><wbr>1060 cp<br><wbr><wbr><wbr><wbr><wbr>3 bash<br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
|
网上有人写了一个perl脚本来处理输出,能得到更直观的结果:
参考:http://www.xaprb.com/blog/2009/08/23/how-to-find-per-process-io-statistics-on-linux/
下载地址:http://aspersa.googlecode.com/svn/trunk/iodump
这是一个perl脚本,原理是:将dmesg清空,然后统计1秒内dmesg所dump的block信息。
while true; do sleep 1; dmesg -c; done | perl iodump
|
因为给出的方法只要结果不要dmesg输出内容,所以封装到while true中然后交给iodump处理
所以执行此命令需要ctrl+c停止之后才能看到结果。
[root@fan3838 tmp]#while true; do sleep 1; dmesg -c; done|perl /root/iodump
# Caught SIGINT.
TASK<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>PID<wbr><wbr><wbr><wbr><wbr>TOTAL<wbr><wbr><wbr><wbr><wbr>READ<wbr><wbr><wbr><wbr>WRITE<wbr><wbr><wbr><wbr>DIRTY DEVICES<br>
kjournald<wbr><wbr><wbr><wbr>349<wbr><wbr><wbr><wbr><wbr><wbr><span style="word-wrap:normal; word-break:normal; line-height:18px; color:rgb(255,1,2)">4185</span><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>0<wbr><wbr><wbr><wbr><wbr>4185<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>0
sda2<br>
cp<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>4701<wbr><wbr><wbr><wbr><wbr><span style="word-wrap:normal; word-break:normal; line-height:18px; color:rgb(255,1,2)">1051</span><wbr><wbr><wbr><wbr>1051<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>0<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>0
sda2<br>
bash<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>4762<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>1<wbr><wbr><wbr><wbr><wbr><wbr>1<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>0<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>0 sda2<br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
|
上面这个结果已经很清楚了,最高的就是cp产生的,说明cp在大概1秒钟之内读写最多,达到1051次
那么造成iowait的罪魁祸首就是cp了。
当然应该多执行几次能得到更精确的结果,有可能是“协助作案”呢。
另:为什么kjournald最多而不“验证”一下这个进程呢?这进程是干什么的?搜索一下,ext3文件系统日志相关。这个进程正常。
测试完毕不要忘记关掉block_dump和启动syslog:
echo 0 > /proc/sys/vm/block_dump
service syslog start
|
分享到:
相关推荐
本文将深入探讨IO流程的基本原理,特别是针对块设备的IO流程,包括从提交读写请求到实际执行请求的全过程。 #### 二、注册与配置 在Linux系统中,块设备驱动的注册通常涉及几个关键步骤: 1. **注册**: 通过`...
5. 计算CPU使用率:根据公式 `(user + nice + system + iowait) / (user + nice + system + idle + iowait)` 计算CPU使用率。需要注意的是,这个计算得到的是所有CPU核心的平均使用率,如果需要每个核心的独立使用率...
### 多线程集合及IO面试知识点概览 #### 逻辑思考题解析 1. **果冻颜色问题**: - 这是一个经典的抽屉原理(鸽巢原理)的应用问题。根据题意,桶里有黄色、绿色和红色三种颜色的果冻。如果随机抓取果冻,为了确保...
在IT行业中,多路I/O(Multiplexing I/O)是一种高效的系统编程技术,它允许一个单独的进程或线程同时处理多个输入/输出事件。这种技术尤其在服务器开发中非常常见,因为服务器通常需要同时服务多个客户端请求。在本...
**示例1:** 查看当前系统中最耗CPU的进程 - 打开终端并输入`top`命令。 - 按`1`键可以显示每个CPU核心的使用情况。 - 使用`Shift`+`P`键按CPU使用率排序。 - 查看最上面的几行,找到CPU使用率最高的进程。 **示例2...
在软件开发过程中,内存问题是非常常见的问题之一,尤其是在高并发场景下。内存问题可能导致系统运行缓慢、响应延迟甚至崩溃。因此,掌握内存问题的分析和解决方法对于提升系统的稳定性和性能至关重要。 #### 二、...
- **说明**:此命令查找连接没有被及时释放而导致的高 CPU 占用情况,其中 `spid` 大于50表示用户进程,`status` 为 `sleeping` 表示进程处于休眠状态,`last_batch` 和 `login_time` 用于判断会话是否长时间未进行...
Java是世界上最流行的编程语言之一,尤其在企业级应用开发中占据主导地位。本资源包“java基础(多线程,IO,集合,网络编程,泛型)”提供了对Java核心技术的全面介绍,包括五个核心主题:多线程、输入/输出(IO)、集合...
进程可以通过fork、execve、wait等系统调用来创建和管理。 10. 线程池和守护线程: 线程池是一种线程管理机制,可以重复使用线程以提高性能。守护线程是一种特殊的线程,可以在后台运行,监控其他线程的状态。 11....
epoll 在被内核初始化时,会开辟出 epoll 自己的内核高速 cache 区,用于安置每一个我们想监控的 socket,这些 socket 会以红黑树的形式保存在内核 cache 里,以支持快速的查找、插入、删除。这个内核高速 cache 区...
包含了进程的控制和调度,如进程状态转换、信号量、互斥锁等同步原语,以及fork、exec和wait等系统调用。 7. **09进程关系.pdf**: 讲解进程间的父子关系、进程组和会话,以及孤儿进程和僵尸进程的概念。 8. **...
- `waittype`, `waittime`, `lastwaittype`, `waitresource`:关于等待和锁的详细信息。 - `dbid`:进程当前使用的数据库ID。 - `uid`:执行命令的用户ID。 - `cpu`, `physical_io`: CPU使用时间和磁盘I/O统计。 - `...
- **多线程**:线程创建、同步机制(synchronized、wait/notify、Lock接口)、并发工具类(如Semaphore、CountDownLatch)等。 - **IO流**:文件读写、对象序列化、管道流、缓冲流等。 - **泛型**:类型安全的...
这段查询会返回当前所有未提交事务的进程ID(spid)、阻塞状态(blocked)、等待时间(waittime)等关键信息,以及SQL语句的文本(text),有助于我们定位问题源头。 接下来,我们需要查找是否存在阻塞或导致死锁的...
2. 查找算法:二分查找、哈希表查找、线性查找。 3. 动态规划:背包问题、最长公共子序列、最短路径问题。 4. 贪心算法:最小生成树(Prim、Kruskal)、区间调度问题。 5. 回溯法与分支限界:八皇后问题、迷宫求解、...
而BIO(Blocking IO)是最传统的IO模型,面试时可能需要对比分析三种模型的优缺点。 5. **JVM**:深入理解JVM内部工作原理,包括类加载机制、内存模型(堆、栈、方法区、本地方法栈)、垃圾收集算法(标记-清除、...
3. **查找高IO的SQL语句**:通过SQL语句直接查找I/O占用率高的查询,这有助于识别可能导致性能瓶颈的语句。 4. **检查V$sysstat**:分析`hard parse`次数,如果硬解析频繁,说明可能存在的SQL语句优化问题,如未...
在准备高级JAVA面试时,全面了解和掌握...通过阅读"Java.doc"、"面试_JAVA_宝典—最全的总结.doc"、"Java框架面试题总结_201104.doc"和"java面试.doc"等文档,可以进一步强化这些知识,并找到面试中的常见问题和答案。