作為服務端的程序員,我們可能會經常需要通過查找日志來分析定位問題。由一個常見的場景引出下面要講的內容,在一個目錄下查找一個待匹配的字符串所在的行,來定位問題。很容易可以用一個命令搞定:
find . -name "*log*" |xargs grep "待匹配的字符串" {} >> res.txt
使用26個文件,每個大概300M,用time命令統計耗時6S,測試結果:
real 0m6.113s
user 0m2.096s
sys 0m4.003s
之前可能會寫下這樣的命令,也能work,但是從沒想過其實還是可以加速的。無意間看到大牛的分享,于是決定仔細研究下。
- xargs —help 查看解釋
-n, --max-args=MAX-ARGS Use at most MAX-ARGS arguments per command
line
-P, --max-procs=MAX-PROCS Run up to max-procs processes at a time
其中對于加速非常關鍵的兩個參數-n -P
- 修改上面的命令
find . -name "*log*" |xargs grep -n 10 -P 10 "待匹配的字符串" {} >> res.txt
- 繼續測試
real 0m1.716s
user 0m2.153s
sys 0m3.897s
- 總結
- 如果不加-n,實測-P不起作用,還是相當于單進程執行。
- -P并不是越多越快,理論上只要小于機器的核心數會更快,但實際并不是(沒理解)。