降低虚机读写NAS速率
背景
在生产上遇到了一个问题:虚机读写NAS数据时造成较大的网络压力。
为解决这个问题,本文提供几个优化读文件命令的方法。
我的上一篇文章用虚机调整网卡速率的方式来解决问题。 本篇文章从命令层面入手,通过优化命令的方式缓解网络压力。
本文设例
以下用查询NAS中文件行数为例子(查询方式无论使用wc -l或awk 亦或sed,这几种命令都没有直接的内置选项来做速度限制)
我们用优化wc -l命令来举例,在虚拟机A中查询NAS中文件file1.DAT的行数,该文件约30GB。
方法可以推广使用,不只是对wc命令
思路!
既然直接wc -l NAS中的文件控制不了速率,那么就使用一种能控制速率把文件读到虚机内存中,然后执行wc 在内存中读文件。这样限制了NAS与虚机之间的网络传输速度,而后在虚机本地内存中做读行数操作,满足我们的需求。
举个很简单的例子,类似cat file1.DAT | wc -l,只不过cat命令没有限制速度的参数选项。
方法1:使用pv
# 虚机A中执行
pv -q -L 10m file1.DAT | wc -l
这个命令 pv -q -L 10m file1.DAT | wc -l 的含义如下:
-
pv -q -L 10m file1.DAT:这部分命令首先会使用 pv 命令来监视文件 file1.DAT 的数据传输过程。-q 选项表示将 pv 命令置于静默模式,不输出任何信息,-L 10m 选项表示限制数据流的传输速率为每秒 10MB。因此,pv 命令会将文件 file1.DAT 的内容通过管道传递给下一个命令,同时限制传输速率为每秒 10MB。
-
| wc -l:这部分命令通过管道将 pv 命令的输出传递给 wc -l 命令,用于统计传输过来的数据流中的行数。wc -l 命令会逐行读取数据流,并统计行数,最终输出文件 file1.DAT 中的行数。
综合起来,这个命令的作用是限制以每秒 10MB 的速率传输文件 file1.DAT 的内容,并统计传输过来的数据流中的行数。
当执行命令 pv -q -L 10m file1.DAT | wc -l 时,pv 命令会从 NAS 中读取文件 file1.DAT 的内容,并将其传递给管道。管道连接的右边是 wc -l 命令,它会在本地内存中统计传输过来的数据流中的行数,而不是直接在 NAS 上进行统计。因此,这样可以避免直接在网络上执行 wc -l 命令造成的网络带宽过大的问题。
通过这种方式,你可以将文件的读取和处理过程分开,在本地内存中对文件内容进行处理,从而避免对网络带宽造成过大的压力。这对于处理大文件或者位于远程服务器的文件来说是一个有效的解决方案。
方法2:使用trickle
# 虚拟机A中执行
trickle -s -d 10MB/s cat file.DAT
下面是命令中各个部分的解释:
-
trickle:是一个用于限制命令带宽的工具。
-
-s:表示以代理模式运行 trickle,这意味着 trickle 将会创建一个代理程序来控制命令的执行。
-
-d 10MB/s:表示设置带宽限制为每秒 10MB,这是限制 cat 命令读取文件的速率为每秒 10MB。
-
cat file.DAT:是要执行的命令,它会读取文件 file.DAT 的内容并将其输出到标准输出(通常是终端屏幕)。
-
|:管道操作符,用于将 cat 命令的输出传递给下一个命令。
-
wc -l:是一个用于统计行数的命令,它将接收到的输入计算行数并输出。
这样的命令可以限制使用 cat 命令读取文件 file.DAT 的速率为每秒 10MB。具体来说,trickle -s -d 10MB/s cat file.DAT 命令会通过 trickle 工具创建一个代理程序,然后将 cat file.DAT 命令的执行委托给这个代理程序。代理程序会控制数据的传输速率,使其不超过指定的速率,从而达到限速的效果。最后文件度到内存中后,再wc -l计算文件行数就不会对网络造成压力。