NAS的主机rsync 同步大量文件的时候,IO占用过大的问题

留学咨询专家王觉菊老师

更新一下,最后发现是在opensuse的操作系统下,挂载原来的centos 7 (4.12kernel)分区的btrfs磁盘,同步其文件到bchace之上的btrfs目录的时候,经常性的出现死锁,io error,bus error。

但是换回原来的centos 7,挂载opensuse做出来的bcache 之上的btrfs文件系统,以及原来的btrfs文件系统,用rsync同步文件的时候,就没有出现io过高导致系统或者非rysnc进程全部(全部全部的其他进程)死机的情况了。

所以,看起来是opensuse和我这个主板的兼容问题。

-------------------

在终端上看到了rsync的进程和进度,但是开另外一个shell要进入系统竟然不行了。

input和output error。

在另外一个终端的运行如下命令

localhost:~ # iotop
Bus error
localhost:~ # ls
Segmentation fault
localhost:~ # dmesg
-bash: /usr/bin/dmesg: Input/output error
localhost:~ #

所以,最终定位到了这个问题,就是io问题咯。

不光这样,停止这个rsync的终端进程之后,reboot命令都不响应了。要硬重启了。这个就非常的恶搞了,你在活着的进程里面可以看到正在rsync文件,速度很快,基本上达到了硬盘写入速度的极限,我的两个5t硬盘组成的btrfs raid0,写入速度是113M/s。然后,打开另外一个进程要登陆,竟然不响应了。ssh无响应。然后连上显示器,猛击回车键,无响应。ctrl alt 和del三剑齐杀,终于屏幕上出现了一个brodcast,什么frozen云云。

开始我以为是装系统的MSSD固态盘不行呢,换了一个盘还是这样。后百思不得其解。甚至想着要淘一个新的集成主板了。后来搜了一下,才在网上看到了一个教程,才发现原来是rsync同步文件的时候io (input /ouput)占用过高,我这个情况它是占用了100%了。马得。所以,只有它这一个进程在拼命工作了。

教程如下,解决方案先推荐大家看。

https://blog.51cto.com/holy2010/1977316

上面提到了用ionice的命令来控制rsync的io占用。

very interesting!

  Ionice命令功能介绍

  ionice – 获取或设置程序的IO调度与优先级。

 

  命令格式:

  ionice [[-c class] [-n classdata] [-t]] -p PID [PID]…

  ionice [-c class] [-n classdata] [-t] COMMAND [ARG]…

 

  IO调度策略:

 

  ionice将磁盘IO调度分为三类:

  ilde:空闲磁盘调度,该调度策略是在当前系统没有其他进程需要进行磁盘IO时,才能进行磁盘;因此该策略对当前系统的影响基本为0;当然,该调度策略不能带有任何优先级参数;目前,普通用户是可以使用该调度策略(自从内核2.6.25开始)。

 

  Best effort:是缺省的磁盘IO调度策略;

  (1)该调度策略可以指定优先级参数(范围是0~7,数值越小,优先级越高);

  (2)针对处于同一优先级的程序将采round-robin方式;

  (3)对于best effort调度策略,8个优先级等级可以说明在给定的一个调度窗口中时间片的大小。

  (4)目前,普调用户(非root用户)是可以使用该调度策略。

  (5)在内核2.6.26之前,没有设置IO优先级的进程会使用“none”作为调度策略,但是这种策略使得进程看起来像是采用了best effort调度策略,因为其优先级是通过关于cpu nice有关的公式计算得到的:io_priority = (cpu_nice + 20) /5。

  (6)在内核2.6.26之后,如果当前系统使用的是CFQ调度器,那么如果进程没有设置IO优先级级别,将采用与内核2.6.26之前版本同样的方式,推到出io优先级级别。Real time:实时调度策略,如果设置了该磁盘IO调度策略,则立即访问磁盘,不管系统中其他进程是否有IO。因此使用实时调度策略,需要注意的是,该访问策略可能会使得其他进程处于等待状态。

 

  参数说明:

  -c class :class表示调度策略,其中0 for none, 1 for real time, 2 for best-effort, 3 for idle。

  -n classdata:classdata表示IO优先级级别,对于best effort和real time,classdata可以设置为0~7。

  -p pid:指定要查看或设置的进程号或者线程号,如果没有指定pid参数,ionice will run the listed program with the given parameters。-t :忽视设置优先级时产生的错误。

所以,之前有一次用这个NAS播放电影又同时rsync文件的时候,导致死机了,看来也是这个rsync的io问题。

 

很多服务器主机租赁商,就是那些搞云主机的,搞vps,虽然看起来不限你硬盘空间,可是却限制了你的io。这样看起来,其实云主机最值钱的就是io和带宽阿。哈哈,要是哪个哥们同步超多的小文件,不限制io的话,那主机也要拖垮了。

 

用了ionice命令调度之后,rsync的写入速度就明显慢了下来,才22M/s了。当然,我的优先级降低了。把优先级提高一下试试。

 

不过我用了ionice,如果用c3,N7,作rsync的话,系统还是会io错误导致bus error导致只有这个进程活着。

不过算了,为了尽快完成文件的同步,我就忍了。

 

分类