## 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的事件响应,串行
零拷贝前提:数据不需要加工