Linux关于IO部分

133 阅读2分钟

## linux查看哪个进程占用磁盘IO

$vmstat 2

执行vmstat命令,可以看到r值和b值较高,r 表示运行和等待cpu时间片的进程数,如果长期大于1,说明cpu不足,需要增加cpu。

b 表示在等待资源的进程数,比如正在等待I/O、或者内存交换等。

### [IO等待导致性能下降](serverfault.com/questions/3…)

$ iotop -oP

命令的含义:只显示有I/O行为的进程

$ iostat -dtxNm 2 10

查看磁盘io状况

$ dstat -r -l -t --top-io

用dstat命令看下io前几名的进程

$ dstat --top-bio-adv

找到那个进程占用IO最多

$ pidstat -d 1

命令的含义:展示I/O统计,每秒更新一次

### [Linux 挂载管理(mount)](www.cnblogs.com/chenmh/p/50…)

$ vim /etc/fstab

mount挂载分区在系统重启之后需要重新挂载,修改/etc/fstab文件可使挂载永久生效

$ mount -t ext4 /dev/sdb1 /sdb1

-t:指定文件系统类型

$ mount -o remount,noatime,data=writeback,barrier=0,nobh /dev/sdb

remount:重新挂载文件系统。

noatime:每次访问文件时不更新文件的访问时间。

async:适用缓存,默认方式。

$ fuser -m /dev/sdb

查看文件系统占用的进程

$ lsof /dev/sdb

查看正在被使用的文件,losf命令是list open file的缩写


网络上的人提供了如下三种解决方案:

升级内核

更改commit的次数, "mount -o remount,commit=60 /dev/sda1"

关闭文件系统日志功能: 操作类似于dumpe2fs 获取文件系统属性信息, tune2fs 调整文件系统属性, 之后e2fsck 检查文件系统(几乎大部分都不推荐这样做)

当然这些方案,我一个都没有采纳,因为我突然想到今天服务器上似乎运行了许多IO操作很频繁的程序,jdb2的特点就是牺牲了性能保证了数据完整性,也就是说是我运行的程序太多让jdb2忙不过来了。

因此我的最终解决方案就是,用kill把所有当前运行的高IO程序都干掉。最后解决了问题

成本:

程序不能直接访问硬件:网卡、磁盘(内核来访问的)

内核提供了:sysctl(软中断、硬中断)

strace -ff -o  ./xxx java TestSocket:抓取程序对内核有没有系统调用

cd /proc/PID:进程的文件描述

cd task:看有多少个线程

cd fd:文件描述符(0、1、2基本描述输入 输出 错误)

netstat -natp 只有服务端只有listen状态

nc:可以和任何程序建立连接

epoll尽量不浪费CPU

select浪费在循环fd的状态

redis io是多线程,使用了epoll的事件响应,串行

零拷贝前提:数据不需要加工