作者:马海琴 编辑:毕小烦
磁盘是可以持久化存储的设备,根据存储介质的不同,常见磁盘可以分为两类:机械磁盘和固态磁盘。磁盘就像人的大脑皮层,负责数据的储存、记忆。
磁盘对于服务器来说十分重要,一旦出现服务器磁盘空间不足,就有可能导致服务器部署的服务异常甚至宕机。
我们关注其中数据块/dev/mapper/vg00-lvroot
的使用。当磁盘占用率过高的时候,需要分析占用是否正常,如果是正常的那就需要增加磁盘大小;如果是不正常的,那么就需要进一步分析是哪里引起的异常。
通过 du
命令,逐步查找最大文件。找到引起异常的文件,基本就能够锁定的问题的所在。
当我们通过 top
命令发现 **wa**
占用率逐渐升高时,说明系统 I/O
存在压力。
我们发现 await
远远高于 svctm
,说明 IO
等待队列较长,磁盘十分繁忙;而 w_await
远高于 r_await
,说明是磁盘写入造成的磁盘繁忙。
通过pidstat -d 1
显示各个进程的 IO
使用情况,发现 3046
这个进程的写入的速度较快。
通过strace -p pid
发现一直在执行数据写入的操作。
通过lsof -p pid
发现文件 test.txt
的写入量很大。
根据出现问题的进程和定位的文件名称,我们再结合源码分析,最后定位出现问题的地方,如果代码无法优化,那就需要考虑提升磁盘的性能。
通过df
命令可以查看服务器磁盘的使用情况。
命令格式:
df [-][ahHikmlPTtx][--block-size=<区块大小>][--no-sync][--sync][文件或设备]
参数解释:
a
:代表包含全部的文件系统。h
:以可读性较高的方式来显示信息。H
:与-h
参数相同,但在计算时是以 1000 Bytes 为换算单位而非 1024 Bytes
。i
:显示 inode
的信息。k
:以 KB
为单位显示容量,默认以 KB
为单位(即指定区块大小为 1024 字节)。m
:以 MB
为单位显示容量,默认以 MB
为单位(即指定区块大小为 1048576 字节)。l
:仅显示本地端的文件系统。P
:使用 POSIX
的输出格式。T
:显示文件系统的类型。t
:等价于--type=TYPE
,仅显示指定文件系统类型的磁盘信息。x
:等价于--exclude-type=TYPE
,不要显示指定文件系统类型的磁盘信息。block-size
:以指定的区块大小来显示区块数目。no-sync
:在取得磁盘使用信息前,不要执行 sync
指令,此为预设值。sync
:在取得磁盘使用信息前,先执行 sync
指令。如:
结果说明:
系统文件(Files``ystem):表示文件系统位于哪个分区,展示文件系统名称。
tmpfs
是一个临时文件系统,驻留在内存中,读写非常快,可以提供较高的访问速度。容量(Size
):文件系统总容量。
已用(Used
):文件系统已使用的容量。
可用(Avail
):文件系统空闲的容量。
可用%(Use%
):文件系统空闲容量占比。
挂载点(Mounted on
):文件系统的挂载点。
通过du
命令查看具体目录下的文件/目录占用空间大小。
命令格式:
du [-abcDhHklmsSx][-L <符号连接>][-X <文件>][--block-size][--exclude=<目录或文件>][--max-depth=<目录层数>][目录或文件]
参数解释:
-a
:显示目录中个别文件的大小、-b
:显示目录或文件大小时,以 byte
为单位、-c
:除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和、-D
:显示指定符号连接的源文件大小、-h
:以 K,M,G 为单位,提高信息的可读性、-H
:与 -h
参数相同,但是 K,M,G 是以 1000 为换算单位。-k
:以 1024 bytes 为单位。-l
:重复计算硬件连接的文件。-L<符号连接>
:显示选项中所指定符号连接的源文件大小。-m
:以 1MB 为单位。-s
:仅显示总计,常用du -sh *
统计当前目录下所有一级目录/文件的总用量。-S
:显示个别目录的大小时,并不含其子目录的大小。-x
:以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。-X<文件>
:在 <文件> 指定目录或文件。--exclude=<目录或文件>
: 略过指定的目录或文件。--max-depth=<目录层数>
: 超过指定层数的目录后,予以忽略。如:
使用iostat
可以监控磁盘的使用情况,通过这个命令可以看出磁盘是否繁忙。
如:
结果说明:
avg-cpu 段:
%user
:在用户级别运行所使用的 CPU 的百分比%nice
:nice操作所使用的 CPU 的百分比%sys
:在系统级别(kernel)运行所使用 CPU 的百分比%iowait
:CPU 等待硬件 I/O 时,所占用 CPU 百分比%idle
:CPU 空闲时间的百分比Device 段:
tps
:每秒钟发送到的 I/O 请求数Blk_read /s
:每秒读取的 block 数Blk_wrtn/s
:每秒写入的 block 数Blk_read
:读入的 block 总数Blk_wrtn
:写入的 block 总数iostat -d -k 1 10
打印所有磁盘的使用状态,每秒钟打印一次,打印十次之后结束。
结果说明:
tps
:该设备每秒的传输次数。“一次传输”意思是“一次 I/O
请求”。多个逻辑请求可能会被合并为“一次 I/O
请求”。“一次传输”请求的大小是未知的。kB_read/s
:每秒从设备(drive expressed)读取的数据量kB_wrtn/s
:每秒向设备(drive expressed)写入的数据量kB_read
:读取的总数据量kB_wrtn
:写入的总数量数据量以上结果的单位都为 KB。
iostat -d -x -k 1 10
打印磁盘扩展信息,每秒钟打印一次,打印十次之后结束。
结果说明:
rrqm/s
:每秒这个设备相关的读取请求有多少被 Merge
了(当系统调用需要读取数据的时候,VFS
将请求发到各个 FS
,如果 FS
发现不同的读取请求读取的是相同 Block
的数据,FS
会将这个请求合并 Merge
)。
wrqm/s
:每秒这个设备相关的写入请求有多少被 Merge
了。
r/s
:每秒读取的扇区数。
w/s
:每秒写入的扇区数。
rkB/s
:每秒向设备发出的读取请求的数量。
wkB/s
:每秒向设备发出的写入请求的数量。
avgrq-sz
:平均请求扇区的大小。
avgqu-sz
:是平均请求队列的长度。队列长度越短,说明性能越好。
await
:每一个 I/O
请求的处理的平均时间(单位是毫秒)。
IO
的响应时间,一般地系统 IO
响应时间应该低于 5ms
,如果大于 10ms
就比较大了。await
大于 svctm
,如果 svctm
的值与 await
很接近,表示几乎没有 I/O
等待,磁盘性能很好,如果 **await**
的值远高于 **svctm**
的值,则表示 **I/O**
队列等待太长,系统上运行的应用程序将变慢。r_await
:每一个读取请求的处理的平均时间。
w_await
:每一个写入请求的处理的平均时间。
svctm
:表示平均每次设备 I/O
操作的服务时间(以毫秒为单位)。
%util
: 在统计时间内所有处理 IO 时间,除以总共统计时间。
1
秒,该设备有 0.7
秒在处理 IO
,而 0.3
秒闲置,那么该设备的 %util = 0.7/1 = 70%
。所以该参数暗示了设备的繁忙程度。**%util**
是 **100%**
表示设备已经接近满负荷运行了(当然如果是多磁盘,即使 %util
是 100%
,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。(完)
如果文章对你有帮助,记得留言、点赞、加关注哦!