性能评估-disk IO
一、磁盘原理
设备又名I/O设备,泛指计算机系统中除主机以外的所有外部设备。
11 计算机分类
111 按照信息传输速度分:
1低速设备:每秒传输信息仅几个字节或者百个字节,如:键盘、鼠标等
2中速设备:每秒传输信息数千个字节或者数万个字节,如:打印机
3高速设备:每秒传输信息数数10万个字节,如:磁盘
112 按照信息交换单位分
1字符设备:以字符为输入/输出信息的单位,如:键盘,显示终端
2块设备:以数据块为单位输入/输出信息,如:磁盘
注:何为数据块:磁盘中常以一个扇区作为一个数据块,一个扇区就是一个读写单位
一、磁盘性能指标
1、测试磁盘性能,使用命令:dd
因数据写入磁盘,可能是缓存写,直接写(不经过缓冲区直接写入磁盘),顺序io,随机io的区别所以,这种dd测试并不是很准确。
这不是一个专业的测试工具,不过如果对于测试结果的要求不是很苛刻的话,平时可以使用来对磁盘的读写速度作一个简单的评估
在使用前首先了解两个特殊设备
/dev/null 伪设备,回收站写该文件不会产生IO
/dev/zero 伪设备,会产生空字符流,对它不会产生IO
通过以上方法就可以大致知道,磁盘的性能了。
从这条命令中:我们知道:IOPS(每秒io请求数)是:691。当前读速率是:044MB/s 写速率是:036MB/s
得出结论有:
每秒共有80个IO请求(IOPS=r/s+w/s),以写为主
io服务时间为156毫秒,平均等待服务时间为353毫秒
io队列深度为:24个
1、vmstat Block in /out
bi+bo过大,而且vmstat cpu wa值较大应该考虑均衡磁盘负载,可以结合iostat输出来分析。
2、IOwait time
iostat iowait% 小于25%,说明IO性能处于良好的状态;
3、util 磁盘使用率
一秒中有百分之多少的时间用于 I/O *** 作,或者说一秒中有多少时间 I/O 队列是非空的,即 delta(use)/s/1000 (因为use的单位为毫秒)
(1)如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。
(2)idle小于70% IO压力就较大了,一般读取速度有较多的wait。
(3)同时可以结合vmstat 查看查看b参数(等待资源的进程数)和wa参数(IO等待所占用的CPU时间的百分比,高过30%时IO压力高)。
4、await 平均等待时间
平均每次设备I/O *** 作的等待时间 (毫秒)即 delta(ruse+wuse)/delta(rio+wio)
await 的大小一般取决于服务时间(svctm) 以及 I/O 队列的长度和 I/O 请求的发出模式。
(1)await 的参数要多和 svctm 来参考。差的过高就一定有 IO 的问题。
(2)如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;
(3)如果 await 远大于 svctm,说明I/O 队列太长,io响应太慢,则需要进行必要优化。如果响应时间超过了用户可以容许的范围,这时可以考虑更换更快的磁盘,调整内核 elevator 算法,优化应用。
5、avgqu-sz 平均I/O队列长度
(1)如果avgqu-sz比较大,也表示有大量io在等待。
avgqu-sz 也是个做 IO 调优时需要注意的地方,这个就是直接每次 *** 作的数据的大小,如果次数多,但数据拿的小的话,其实 IO 也会很小。如果数据拿的大,IO 的数据会高。也可以通过 avgqu-sz × ( r/s or w/s ) = rsec/s or wsec/s。也就是讲,读写速度是这个来决定的。
由于 avgqu-sz 是按照单位时间的平均值,所以不能反映瞬间的 I/O 洪水。
里面最重要的参数,actual disk read 和actual disk write 分别代表实际磁盘读写速度
然后下面,我们可以根据每一列进行io排序,就能知道io具体消耗是哪个进程导致的。
注意:TID代表的是线程号,如果是多线程的话,可以借助command 判断是哪个进程,也可以根据ps -eLf | grep TID 来获取到他的父进程号。
221 topas 获取是否存在io等待
仔细观察 “Wait”(在 CPU 部分的上部),如果改值较大则表示io可能存在瓶颈
222 获取io队列、IOPS、响应时间等
登录 AIX *** 作系统,输入 topas,然后按 D,会出现如下界面:
在上图中,hdisk2 的TPS 即为磁盘的 IOPS(每秒发出的io请求数),为 655;KBPS 即为磁盘每秒的吞吐量,为 1639M;尤其是应该检查 ART/AWT 和 MRT/MWT,它们表示磁盘读写 *** 作的平均和最大等待时间。比较高的值表明磁盘非常忙。AQW 表示对 I/O 设备的每个请求的平均等待队列数量。同样,比较高的值表明磁盘的速度无法跟上请求的速度。
223 查看产生瓶颈的原因
1可以使用其他工具(如 filemon、fileplace、lsof 或 lslv)帮助确定究竟是哪个进程、适配器或者文件系统导致了瓶颈。
2可以使用ps -ef | grep "pid" 来查看当前进程所在执行的任务
find -type f -size +100M -print0 | xargs -0 du -h | sort -nr
姓名:王央京 学号:18050100052 学院:电子工程学院
转自:>
可以用下面的命令将 cpu 占用率高的线程找出来: ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu 这个命令首先指定参数'H',显示线程相关的信息,格式输出中包含:user,pid,ppid,tid,time,%cpu,cmd,然后再用%cpu字段进行排序。这样就可以找到占用处理器的线程了。 直接使用 ps Hh -eo pid,tid,pcpu | sort -nk3 |tail 获取对于的进程号和线程号,然后跳转到
2
查看哪个进程线程占用cpu过高; top / ps -aux, 获得进程号 确定哪个线程占用cpu过高,进入进程号的目录:/proc/pid/task, 执行:grep SleepAVG /status | sort -k2,2 |
方法一:可以通过/proc/线程ID/stack来获取指定线程当前的调用栈,但是该方案存在限制:可能不能准确获取出问题的时候该线程的调用栈
方法二:通过内核接口save_stack_trace_tsk和%pS,在程序检测到异常的时候打印出对应的调用栈用于问题定位,具体的方法(从内核/proc文件系统处理打印调用栈的proc_pid_stack中简单修改而来):
[cpp] view plain copy
static int kprink_stack(struct task_struct task)
{
struct stack_trace trace;
unsigned long entries;
int err;
entries = kmalloc(MAX_STACK_TRACE_DEPTH sizeof(entries), GFP_KERNEL);
if (!entries)
return -ENOMEM;
tracenr_entries = 0;/调用返回后,为记录的调用栈中的有效符号的个数/
tracemax_entries = MAX_STACK_TRACE_DEPTH;/传入的traceentries的大小,save_stack_trace_tsk最多保持该数量的调用栈符号/
traceentries = entries;/返回的符号地址保存在这里/
traceskip = 0;/从调用栈的顶开始,忽略的调用栈符号数量/
err = lock_trace(task);
if (!err) {
save_stack_trace_tsk(task, &trace);
for (i = 0; i < tracenr_entries; i++) {
printk(m, "[<%pK>] %pS\n",
(void )entries[i], (void )entries[i]);
}
unlock_trace(task);
}
kfree(entries);
return err;
}
说明:其中的%pS用于打印内核符号,内核的相关处理见printk--->vprintk--->vscnprintf-->vsnprintf-->symbol_string的处理
以上就是关于性能评估-disk IO全部的内容,包括:性能评估-disk IO、嵌入式与Linux(五):Linux线程、threadx怎么查各任务对cpu的使用率等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)