5.27 IO 基础学习

2023年 8月 29日 176.7k 0

5.27 IO 基础学习

I/O 分析手法

  • I/O 是针对磁盘和内存来说的
  • I:内存从磁盘中读取数据
  • O:内存向磁盘写入数据
  • 系统级IO监控:iostat、vmstat 进程级IO监控:iodump、iotop 文件级IO监控:ioprofile,sysstat

为什么要关注 I/O

大多数时间里性能由于在硬盘上的高 I/O 读和写降低了性能。如果它很高或者波动,很可能就是它造成的。因此,我们需要检查硬盘上的 I/O 活动。

分析 I/O 的相关命令

vmstat

简介

vmstat(Virtual Memory Statistics 虚拟内存统计) 命令用来显示Linux系统虚拟内存状态,也可以报告关于进程、内存、I/O等系统整体运行状态。

代码实现文件路径:http://10.205.0.38:8080/sprds_int/xref/external/toybox/toys/other/vmstat.c

示例

5.27 IO 基础学习-1

procs:
    r: 运行队列中进程数量,这个值也可以判断是否需要增加CPU。(长期大于1)
    b: 等待IO的进程数量。
memory:
    swpd: 使用虚拟内存大小,如果swpd的值不为0,但是SI,SO的值长期为0,这种情况不会影响系统性能。
    free: 空闲物理内存大小。
    buff: 用作缓冲的内存大小。
    cache: 用作缓存的内存大小,如果cache的值大的时候,说明cache处的文件数多,如果频繁访问到的文件都能被cache处,那么磁盘的读IO bi会非常小

好不容易理解了 buffer 和 cache 的区别

buffer 和 cache 是内存划分出来的两个不同区域。

内存空间 = 绝对 used + 绝对 free + buffer(used+free) + cache(used+free)

buffer:缓冲,一般用来高速设备向低速设备写数据时,避免突发性 IO。当高速设备向低速设备写数据时,会先将数据填满 buffer,最后再一次性写入低速设备。

cache:缓存,一般用来高速设备向低速设备读数据时。当高速设备向低速设备读数据时,第一次读取的时候,会在 cache 中拷贝一份数据。然后后续高速设备再向低速设备读取数据的时候,直接从 cache 中读取数据。

参考文档:www.cnblogs.com/M18-BlankBo…

swap:
    si: 每秒从交换区写到内存的大小,由磁盘调入内存。
    so: 每秒写入交换区的内存大小,由内存调入磁盘。

注意:内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。有些朋友看到空闲内存(free)很少的或接近于0时,就认为内存不够用了,不能光看这一点,还要结合si和so,如果free很少,但是si和so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。因为linux总是先把内存用光

IO:
    bi: 从块设备读取数据的量(读磁盘);从磁盘里出来进入到内存里边去
    bo: 从块设备写入数据的量(写磁盘);

注意:随机磁盘读写的时候,这2个值越大(如超出1024k),能看到CPU在IO等待的值也会越大。

system:
    in: 每秒中断数,包括时钟中断。
    cs: 每秒上下文切换数。

注意:上面2个值越大,会看到由内核消耗的CPU时间会越大

cpu:
    us: 用户进程执行时间百分比(user time) us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速。
    sy: 内核系统进程执行时间百分比(system time) sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因。
    wa: IO等待时间百分比 wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。
    id: 空闲时间百分比

lsof + strace

lsof 查看进程打开的文件描述符

5.27 IO 基础学习-1

COMMAND:进程的名称
PID:进程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件。
TYPE:文件类型
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称

统计系统中当前打开的总文件句柄数:lsof|awk '{print $2}'|wc -l

根据打开文件句柄的数量降序排列,其中第二列为进程ID:lsof|awk '{print $2}'|uniq -c|sort -nr|more

strace –p 1693 #按照Pid查询系统调用

strace常用来跟踪进程执行时的系统调用和所接收的信号。

有两种跟踪模式。

一种是通过它启动要跟踪的进程。用法很简单,在原本的命令前加上strace即可

另外一种运行模式,是跟踪已经在运行的进程,在不中断进程执行的情况下,理解它在干嘛
  • e.g. strace -tt -T -v -f -e trace=file -o /data/log/strace.log -s 1024 -p 23489

      这里的输出只显示和文件访问有关的内容,这是因为我们通过-e trace=file 选项指定了
    
      -tt 在每行输出的前面,显示毫秒级别的时间
      -T 显示每次系统调用所花费的时间
      -v 对于某些相关调用,把完整的环境变量,文件stat结构等打出来。
      -f 跟踪目标进程,以及目标进程创建的所有子进程
      -e 控制要跟踪的事件和跟踪行为,比如指定要跟踪的系统调用名称
      -o 把strace的输出单独写到指定的文件
      -s 当系统调用的某个参数是字符串时,最多输出指定长度的内容,默认是32个字节
      -p 指定要跟踪的进程pid, 要同时跟踪多个pid, 重复多次-p选项即可。
    

参考文档:www.cnblogs.com/zhiminyu/p/…

  • 追踪一个已经存在的进程: strace -p [pid]

    5.27 IO 基础学习-1

  • 统计系统调用次数 strace -p [pid] -c 使用ctrl+c 停止统计

    5.27 IO 基础学习-1

  • 统计系统调用时间点 strace -p [pid] -tt

  • 查看每一条系统调用的耗时

    5.27 IO 基础学习-1

Linux I/O 的五种模型

相关文章

服务器端口转发,带你了解服务器端口转发
服务器开放端口,服务器开放端口的步骤
产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
如何使用 WinGet 下载 Microsoft Store 应用
百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

发布评论