centos io限制?centos7

本篇文章给大家谈谈centos io限制,以及centos7对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

CentOS系统中跟踪高IO等待详解

高IO等待问题的第一个征兆通常是系统平均负载。负载均衡的计算都是基于CPU利用率的,即使用或等待CPU的进程数目,当然,在Linux平台上,进程几乎都处于不可中断的睡眠状态。负载均衡的基线可以解释为,在一个CPU核的机器上上,该CPU得到充分利用。因此,对于4核机器中,如果系统平均复杂为 4,表示该机器有足够的资源来处理它需要做的工作,当然只是勉强。在相同的4核系统,如果平均复杂是8,那么以为这将意味着服务器系统需要8个core才能处理所要做的工作,但现在只有4个核,所以已经超载。

如果系统显示平均负载较高,但是CPU的系统(system)和用户(user)利用率较低,那么就需要观察IO等待(即IO wait)。在linuc系统上,IO wait对系统负载有较大的影响,主要因为一个或多个核都可能被磁盘IO或网络

发现进程在等待IO完成是一回事,验证高IO wait的原因是另一回事。使用”iostat–x 1”能够显示正在使用的物理存储设备的IO情况:

[username@server~]$ iostat-x 1

Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm%util

cciss/c0d0 0.08 5.94 1.28 2.75 17.34 69.52 21.60 0.11 26.82 4.12 1.66

cciss/c0d0p1 0.00 0.00 0.00 0.00 0.00 0.00 5.30 0.00 8.76 5.98 0.00

cciss/c0d0p2 0.00 0.00 0.00 0.00 0.00 0.00 58.45 0.00 7.79 3.21 0.00

cciss/c0d0p3 0.08 5.94 1.28 2.75 17.34 69.52 21.60 0.11 26.82 4.12 1.66

由上可知,很明显,设备/dev/cciss/c0d0p3的等待时间很长。然而,我们并没有挂载找个设备,实际上,它是个LVM设备。如果您使用的是 LVM作为存储,那么,您应该发现iostat应该有那么一点混乱。LVM使用device mapper子系统将文件系统映射到物理设备,因此,iostat可能显示多个设备,比如/ dev/dm-0和/ dev/dm-1。而”df–h”的输出却不会显示device mapper路径,而是打印了LVM路径。最简单的方法是在iostat参数中添加选项”-N”。

[username@server~]$ iostat-xN 1

Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm%util

vg1-root 0.00 0.00 0.09 3.01 0.85 24.08 8.05 0.08 24.69 1.79 0.55

vg1-home 0.00 0.00 0.05 1.46 0.97 11.69 8.36 0.03 19.89 3.76 0.57

vg1-opt 0.00 0.00 0.03 1.56 0.46 12.48 8.12 0.05 29.89 3.53 0.56

vg1-tmp 0.00 0.00 0.00 0.06 0.00 0.45 8.00 0.00 24.85 4.90 0.03

vg1-usr 0.00 0.00 0.63 1.41 5.85 11.28 8.38 0.07 32.48 3.11 0.63

vg1-var 0.00 0.00 0.55 1.19 9.21 9.54 10.74 0.04 24.10 4.24 0.74

vg1-swaplv 0.00 0.00 0.00 0.00 0.00 0.00 8.00 0.00 3.98 1.88 0.00

为简便起见,裁剪上面iostat命令的输出信息。列出的每个文件系统所显示出的IO等待都是不可接受的,观察第十栏标有“await”的数据。相比而言,文件系统/usr的await时间要高一些。我们先来分析一下这个文件系统,使用命令” fuser-vm/opt”查看哪些进程在访问这个文件系统,进程列表如下。

root@server:/root> fuser-vm/opt

USER PID ACCESS COMMAND

/opt: db2fenc1 1067....m db2fmp

db2fenc1 1071....m db2fmp

db2fenc1 2560....m db2fmp

db2fenc1 5221....m db2fmp

当前服务器上有112个DB2进程正在访问/opt文件系统,为简便起见,列出四项。看来已经找到导致问题的原因,在服务器上,数据库配置为可使用速度更快的SAN访问,操作系统可以使用的是本地磁盘。可以打电话问问DBA(数据库管理员)怎么做才能这样配置。

最后一个组要的注意的是LVM和device mapper。“Iostat–xN”命令的输出显示的是逻辑卷名,但它是可以通过命令”ls–lrt/ dev/mapper”查到映射关系表。输出信息的第六列中的dm-是与iostat中的设备名相对应的。

有时候,在操作系统或应用层是没有什么可以做的,除了选择速度更快的磁盘,并没有其他的选择。幸运的是,快速磁盘访问,如SAN或SSD的价格正在逐步下降。

解决centos7.2中磁盘iowait过高(centos7启动后盘符错位问题)

(一)简述

每天都收到磁盘iowait告警信息,尤其是日志服务器在进行大量的读写操作过程中,从而造成系统处于崩溃边缘,为查找磁盘iowait由于什么原因造成的以及后续的系统的优化点。centos有许多查找问题的工具,也有高级的。

I/O Wait就是一个需要使用高级的工具来debug的问题,当然也有许多基本工具的高级用法。I/O wait的问题难以定位的原因是因为我们有很多工具可以告诉你说I/O受限了,但是并没有告诉你具体是哪些进程们引起的。

具体的思路如下:top。查看由cpu一行浪费在iowait上的cpu百分比=iostat-x 2 5查看某块磁盘正在被写入= iotop查找最高的磁盘I/O对应的进程= lsof-p pid查看通过一个进程打开所有文件或打开一个文件的所有进程。

(二)具体步骤如下:

(1)通过top命令来确认是否是I/O导致系统缓慢。

[root@iZ23iod5vslZ~]# toptop- 15:38:32 up 40 days, 5:59, 3 users, load average: 0.00, 0.01, 0.05Tasks: 128 total, 1 running, 127 sleeping, 0 stopped, 0 zombieCpu(s): 0.4 us, 0.2 sy, 0.0 ni, 99.2 id, 98 wa, 0.0 hi, 0.0 si, 0.1 stKiB Mem: 32520424 total, 31492136 used, 1028288 free, 412772 buffersKiB Swap: 0 total, 0 used, 0 free. 25902892 cached Mem PID USER PR NI VIRT RES SHR S CPU MEM TIME+ COMMAND 18988 root 20 0 11.647g 3.611g 7896 S 2.7 11.6 507:57.30 java 28 root 20 0 0 0 0 S 0.3 0.0 6:43.31 rcuos/3 1 root 20 0 49556 3412 1912 S 0.0 0.0 0:14.60 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:48.28 ksoftirqd/0 5 root 0-20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H 7 root rt 0 0 0 0 S 0.0 0.0 0:00.83 migration/0 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh 9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/0 10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/1 11 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/2 12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/3 13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/4 14 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/5 15 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/6 16 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/7

从Cpu一行我们可以看到浪费在I/O Wait上的CPU百分比;这个数字越高说明越多的CPU资源在等待I/O权限.具体的解释如下:

0.4 us用户空间占用CPU的百分比。

0.2 sy内核空间占用CPU的百分比。

0.0 ni改变过优先级的进程占用CPU的百分比

2 id空闲CPU百分比

98 wa IO等待占用CPU的百分比

0.0 hi硬中断(Hardware IRQ)占用CPU的百分比

0.0 si软中断(Software Interrupts)占用CPU的百分比

在这里CPU的使用比率和windows概念不同,如果你不理解用户空间和内核空间,需要充充电了

(2)通过iostat-x 3 3查看那块磁盘正在被写入。

[root@iZ23iod5vslZ~]# iostat-x 3 3Linux 3.10.0-123.9.3.el7.x86_64(iZ23iod5vslZ) 08/14/2017 _x86_64_(4 CPU)avg-cpu: user nice system iowait steal idle 0.70 0.00 0.16 0.75 0.05 98.34Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm utilxvda 0.00 21.18 0.32 18.33 9.94 195.06 21.98 0.08 4.11 11.44 3.98 1.54 2.88xvdb 0.00 15.21 1.23 1.98 38.41 68.76 66.70 0.08 25.48 3.59 39.10 1.09 0.35xvdc 0.00 0.07 0.00 0.91 0.00 36.25 79.43 0.10 106.88 12.53 106.92 1.33 0.12avg-cpu: user nice system iowait steal idle 0.75 0.00 0.17 0.08 0.08 98.91Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm utilxvda 0.00 2.33 0.00 0.67 0.00 12.00 36.00 0.00 5.50 0.00 5.50 5.50 0.37xvdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00xvdc 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00avg-cpu: user nice system iowait steal idle 0.75 0.00 0.17 0.00 0.00 99.08Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm utilxvda 0.00 3.33 0.00 1.67 0.00 34.67 41.60 0.01 3.00 0.00 3.00 1.60 100.27xvdb 0.00 9.00 0.00 1.67 0.00 42.67 51.20 0.01 5.40 0.00 5.40 1.80 0.30xvdc 0.00 0.33 0.00 0.67 0.00 4.00 12.00 0.00 2.00 0.00 2.00 2.00 0.13

每隔三秒更新一次,一共打印了三次。-x时打印出扩展选项。第一次打印的信息可以被忽略,剩下的报告,都是基于上一次间隔的时间打印出来。

上述的列子中xvda的 util(利用率)是100.27,有进程往磁盘中写入数据。

(3)通过iotop查找高I/O对应的进程

[root@iZ23iod5vslZ~]# iotopTotal DISK READ: 0.00 B/s| Total DISK WRITE: 15.67 K/sActual DISK READ: 0.00 B/s| Actual DISK WRITE: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND 18793 be/4 root 0.00 B/s 3.92 K/s 0.00 0.00 java-Djava.util.logging.config.file=/usr/to~p org.apache.catalina.startup.Bootstrap start18987 be/4 root 0.00 B/s 3.92 K/s 0.00 0.00 cronolog/guojinbao/tomcat/logs/catalina.Y-m-d.out18796 be/4 root 0.00 B/s 3.92 K/s 0.00 0.00 java-Djava.util.logging.config.file=/usr/to~p org.apache.catalina.startup.Bootstrap start13193 be/4 root 0.00 B/s 3.92 K/s 0.00 0.00 java-Djava.util.logging.config.file=/usr/to~p org.apache.catalina.startup.Bootstrap start 1 be/4 root 0.00 B/s 0.00 B/s 0.00 0.00 systemd--switched-root--system--deserialize 22 2 be/4 root 0.00 B/s 0.00 B/s 0.00 0.00 [kthreadd] 3 be/4 root 0.00 B/s 0.00 B/s 0.00 0.00 [ksoftirqd/0]16388 be/4 root 0.00 B/s 0.00 B/s 0.00 0.00 AliYunDun 5 be/0 root 0.00 B/s 0.00 B/s 0.00 0.00 [kworker/0:0H]16390 be/4 root 0.00 B/s 0.00 B/s 0.00 0.00 AliYunDun 7 rt/4 root 0.00 B/s 0.00 B/s 0.00 0.00 [migration/0] 8 be/4 root 0.00 B/s 0.00 B/s 0.00 0.00 [rcu_bh] 9 be/4 root 0.00 B/s 0.00 B/s 0.00 0.00 [rcuob/0] 10 be/4 root 0.00 B/s 0.00 B/s 0.00 0.00 [rcuob/1] 11 be/4 root 0.00 B/s 0.00 B/s 0.00 0.00 [rcuob/2]

从上述的例子中可以看出进程号为cronolog18987占用了大量的磁盘IO

(4)通过lsof-p pid查找由那个文件引起的IOwait

[root@iZ23iod5vslZ~]# lsof-p 18987COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEcronolog 18987 root cwd DIR 202,17 20480 2400258/guojinbao/tomcat/logscronolog 18987 root rtd DIR 202,1 4096 2/cronolog 18987 root txt REG 202,1 48627 152798/usr/local/sbin/cronologcronolog 18987 root mem REG 202,1 2107600 132826/usr/lib64/libc-2.17.socronolog 18987 root mem REG 202,1 160240 132819/usr/lib64/ld-2.17.socronolog 18987 root 0r FIFO 0,8 0t0 42614018 pipecronolog 18987 root 1w CHR 1,3 0t0 1028/dev/nullcronolog 18987 root 2u CHR 136,0 0t0 3/dev/pts/0(deleted)cronolog 18987 root 3w REG 202,17 5704875979 2400280/guojinbao/tomcat/logs/catalina.2017-08-14.out

lsof命令可以展示一个进程打开的所有文件,或者打开一个文件的所有进程。从这个列表中,我们可以找到具体是什么文件被写入,根据文件的大小和/proc中io文件的具体数据.

为了确认我们的怀疑,我们可以使用/proc文件系统,每个进程目录下都有一个叫io的文件,里边保存这和iotop类似的信息

[root@iZ23iod5vslZ~]# cat/proc/18987/io rchar: 58891582418wchar: 58891579778syscr: 46556085syscw: 46556077read_bytes: 212992write_bytes: 59580235776cancelled_write_bytes: 0

read_bytes和write_bytes是这个进程从磁盘读写的字节数。这个例子中cronolog读取了212992byte(0.2M)数据,写入了59580235776bytes(55.4G)数据到磁盘上。

(5)通过df-h/guojinbao来查看服务器那块磁盘的根目录

[root@iZ23iod5vslZ~]# df-h/guojinbao/Filesystem Size Used Avail Use Mounted on/dev/xvdb1 45G 38G 4.7G 89/guojinbao

最后,通过以上的信息我们可以放心的说lsof的结果就是我们要查找的文件

如何让CentOS服务器磁盘io性能翻倍

如何让CentOS服务器磁盘io性能翻倍

这一期我们来看一下有哪些办法可以减少linux下的文件碎片。主要是针对磁盘长期满负荷运转的使用场景(例如http代理服务器);另外有一个小技巧,针对互联网图片服务器,可以将io性能提升数倍。如果为服务器订制一个专用文件系统,可以完全解决文件碎片的问题,将磁盘io的性能发挥至极限。对于我们的代理服务器,相当于把io性能提升到3-5倍。

在现有文件系统下进行优化linux内核和各个文件系统采用了几个优化方案来提升磁盘访问速度。但这些优化方案需要在我们的服务器设计中进行配合才能得到充分发挥。

文件系统缓存linux内核会将大部分空闲内存交给虚拟文件系统,来作为文件缓存,叫做page cache。在内存不足时,这部分内存会采用lru算法进行淘汰。通过free命令查看内存,显示为cached的部分就是文件缓存了。

如果能找到当前使用场景下,文件被访问的统计特征,针对性的写一个淘汰算法,可以大幅提升文件缓存的命中率。对于http正向代理来说,一个好的淘汰算法可以用1GB内存达到lru算法100GB内存的缓存效果。如果不打算写一个新的淘汰算法,一般不需要在应用层再搭一个文件cache程序来做缓存。

最小分配

最小分配的副作用是会浪费一些磁盘空间(分配了但是又没有使用)

如果当前使用场景下小文件很多,把预分配改大就会浪费很多磁盘空间,所以这个数值要根据当前使用场景来设定。似乎要直接改源代码才能生效,不太记得了,09年的时候改的,有兴趣的同学自己google吧。

io访问调度

如何针对性优化:io访问调度能大幅提升io性能,前提是应用层同时发起了足够的io访问供linux去调度。怎样才能从应用层同时向内核发起多个io访问呢?方案一是用aio_read异步发起多个文件读写请求。

小提示:将文件句柄设置为非阻塞时,进程还是会睡眠等待磁盘io,非阻塞对于文件读写是不生效的。在正常情况下,读文件只会引入十几毫秒睡眠,所以不太明显;而在磁盘io极大时,读文件会引起十秒以上的进程睡眠。详见内核源代码do_generic_file_read会调用lock_page_killable进入睡眠,但是不会判断句柄的非阻塞标志。

预读取linux内核可以预测我们“将来的读请求”并提前将数据读取出来。通过预读取可以减少读io的次数,并且减小读请求的延时。

当文件扩大,需要分配磁盘空间时,可以不立即进行分配,而是暂存在内存中,将多次分配磁盘空间的请求聚合在一起后,再进行一次性分配。

延迟分配的副作用有几个:1如果应用程序每次写数据后都通过fsync等接口进行强制刷新,延迟分配将不起作用2延迟分配有可能间歇性引入一个较大的磁盘IO延时(因为要一次性向磁盘写入较多数据)

如何针对性优化:

“让每个目录下的文件连续存储”是一个极有价值的功能。假设一个网页上有10张图片,这10张图片虽然存在10个文件中,但其实是几乎同时被用户访问的。如果能让这10张图片存储在连续的磁盘空间中,就能把io性能提升10倍(一次寻道就可以读10个文件了)传统的做法是通过拼接图片来将这10张图片合并到一张大图中,再由前端将大图切成10张小图。有了e4defrag后,可以将需连续访问的文件放在同一个文件夹下,再定期使用e4defrag进行磁盘整理。

实现自己的文件系统我们曾经写过一款专用文件系统,针对代理服务器,将磁盘io性能提升到3-5倍。在大部分服务器上,不需要支持“修改文件”这个功能。一旦文件创建好,就不能再做修改操作,只支持读取和删除。在这个前提下,我们可以消灭所有文件碎片,把磁盘io效率提升到理论极限。

大于16MB的文件,服务器创建文件时告诉文件系统分配16MB磁盘空间。后续每次扩大文件大小时,要么是16MB,要么就是文件终结。不允许在文件未终结的情况下分配非16MB的空间。读写文件时,每次读写16MB或者直到文件末尾。

在我们的文件系统中,小文件完全无碎片,一次寻道就能搞定一个文件,达到了理论上最佳的性能。大文件每次磁头定位读写16MB,性能没有达到100%,但已经相当好了。有一个公式可以衡量磁盘io的效率:磁盘利用率=传输时间/(平均寻道时间+传输时间)对我们当时采用的磁盘来说(1T 7200转sata),16MB连续读写已经可以达到98%以上的磁盘利用率。

阅读剩余
THE END