管道查看器 - 進度監視器性能結果
我正在編寫一個批處理腳本來對數據的演出和演出進行排序。所有數據都是文本,但腳本需要很長時間才能執行。我想給出一些腳本正在執行的視覺指示。我找到了一個名為的程序
pv
,它允許您創建進度條和其他漂亮的CLI
進度指示器。我的問題是這樣的事情對性能有什麼類型的影響,是否有其他選擇,而無需我重新發明輪子。
我已經用Google搜尋了它並沒有發現任何令人驚訝的東西,因為我認為你只會在性能很重要的長期任務上顯示進度。但我想我正在使用時鐘週期,您也可以使用它來測量磁碟 I/O 或網路數據傳輸,其中使用幾個週期來指示進度並不重要。
有任何想法嗎?
PS我也考慮過使用這個
echo -ne
技巧來創建我自己的,但為了使它可行,我必須%
在每個循環上使用運算符,並且只在第 100 個左右的循環中採取行動,但這是很多浪費的計算……
由於額外的 IPC,通常(缺少零複製技巧)會產生可測量的成本:將數據從一個程序複製到另一個程序,而不是直接讀取文件的“主力”程序。由於其他原因,管道還可能導致性能(或功能)損失:使用管道輸入,程序不能
seek()
在其輸入上,也不能mmap()
。通常,主要的性能瓶頸可能是磁碟 I/O 和 CPU 計算時間(在您的情況下這可能是密集的)。這些可能比 IPC 成本大得多,但這裡有很多變數(CPU 類型、磁碟類型和文件系統類型、可用的物理 RAM、作業系統和版本、libc 和版本——至少)。
您可以通過一些快速測試大致了解性能,注意在每次測試之間刷新磁碟記憶體(我使用的是 linux,我使用這種方法)。
# time ( pv -pt somethinglarge.iso | sha256sum ) [...] real 0m8.066s user 0m5.146s sys 0m1.075s # time ( sha256sum somethinglarge.iso ) [...] real 0m7.913s user 0m5.064s sys 0m0.309s
請注意相似的實際時間和使用者時間,以及由於額外複製而導致管道案例的系統時間顯著增加。
在某些作業系統上,特別是 Linux,您可能能夠從(參見 3.3)讀取每個程序的 I/O 統計資訊
/proc
(為此您需要CONFIG_TASKSTATS
在核心中啟用)。這不像pv
.pidstat
使用它,它可用於在 PID 上顯示實時吞吐量(速率),但它作為完成指示器的用處不大。一個類似的linux選項(這個不需要
CONFIG_TASKSTATS
),給定一個程序和文件描述符,你可以跟踪文件描述符在/proc/PID/fdinfo/FD
(pos:
欄位)中的偏移量。這是一個顯示這一點的玩具腳本:FILE=/tmp/some-large-input SZ=$(stat -c "%s" "$FILE") # start slow process in background ( some-slow-command $FILE ) & PID=$! FD=/proc/$PID/fdinfo/3 # some experimentation required # or iterate over /proc/$PID/fd/* with readlink # start %-ometer in background, exits when FD disappears ( while nawk '/^pos:/{printf("%i\n",$2*100/'$SZ')}' $FD 2>/dev/null ; do sleep 5 # adjust done | dialog --gauge "$PID: processing $FILE ($SZ bytes)" 10 60 ) & wait $PID if [ $? -eq 0 ]; then echo 100 | dialog --gauge "$PID: completed $FILE ($SZ bytes)" 10 60 else echo ... fi
(警告:對於小文件不准確,libc stdio 緩衝會扭曲結果。)
我現在想到的其他選擇:
- 用於監視程序 fd 偏移量
lsof
並不完全是 輕量級的,而是多平台的,並且您可以在事後在任何長時間執行的程序上啟動它,這是您無法做到的(它也不漂亮,因為拒絕同時提供大小和一口氣抵消)pv``lsof
- 一些hackish
LD_PRELOAD
和一些跟踪數據讀/寫的存根,這也是多平台的,但我認為你必須自己寫(我不知道有什麼能做到這一點,但這是我的一個相關答案)- *更新:有人費心編寫通用傳輸監控工具cv以在 Linux 上與coreutils命令一起使用。*它使用與該方法類似的邏輯
/proc
fdinfo
(如上面的 shell hack 所示)。它還有一個後台模式,它掃描 /proc 並在找到它們時報告正在進行的傳輸。查看相關問題是否可以查看 cp 速度和複製百分比?