性能评估-disk IO

性能评估-disk IO,第1张

性能评估-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的使用率等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10039814.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-04
下一篇 2023-05-04

发表评论

登录后才能评论

评论列表(0条)

保存