Text-Processing

管道查看器 - 進度監視器性能結果

  • April 2, 2015

我正在編寫一個批處理腳本來對數據的演出和演出進行排序。所有數據都是文本,但腳本需要很長時間才能執行。我想給出一些腳本正在執行的視覺指示。我找到了一個名為的程序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/FDpos:欄位)中的偏移量。這是一個顯示這一點的玩具腳本:

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
  • 一些hackishLD_PRELOAD和一些跟踪數據讀/寫的存根,這也是多平台的,但我認為你必須自己寫(我不知道有什麼能做到這一點,但這是我的一個相關答案)
  • *更新:有人費心編寫通用傳輸監控工具cv以在 Linux 上與coreutils命令一起使用。*它使用與該方法類似的邏輯/proc fdinfo(如上面的 shell hack 所示)。它還有一個後台模式,它掃描 /proc 並在找到它們時報告正在進行的傳輸。查看相關問題是否可以查看 cp 速度和複製百分比?

引用自:https://unix.stackexchange.com/questions/191386