Memory

為什麼 /proc/ 中忽略 memmap IO磷一世D磷一世DPID/io

  • March 5, 2020

我有問題 /proc/

$$ PID $$/io 和 memmap 我需要分析使用 python 庫astropy的應用程序 IO 。

我遇到的問題之一是 /proc/ 中的 IO 讀/寫總字節數不正確$$ PID $$/io。 我有一個腳本copy.sh

#!/bin/bash
cp huge.fits huge.2.fits
#python copyfits.py
#python copyfitsMemmapOFF.py
sleep 5 
cat /proc/$$/io

我評論了該cp行以及我想為每個測試執行的行。

copyfits.py包含:

from astropy.io import fits    
hdulist = fits.open('huge.fits', mode='readonly')
hdulist.writeto('huge.2.fits')
hdulist.close()

copyfitsMemmapOFF.py包含:

   from astropy.io import fits    
   hdulist = fits.open('huge.fits', mode='readonly', memmap=False)
   hdulist.writeto('huge.2.fits')
   hdulist.close()

以下是每個解決方案的 IO 結果:

cp huge.fits huge.2.fits

rchar: 9749929202
wchar: 9749551680

python copyfits.py

**rchar: 8399421**
wchar: 9749551685

python copyfitsMemmapOFF.py

rchar: 9757502959
wchar: 9749551685

我了解當使用此變數監控應用程序讀取文件的數量時,關閉 memmap 會導致 IO 結果不一致。memmap 如何/為什麼不計入標準 IO 中,我如何才能找到這些 IO ?

因為如果它是核心而不是應用程序讀取文件,則仍然可以訪問該文件。

/proc``io只跟踪“顯式”I/O,即使用少量系統呼叫執行的I/O。對於讀取,它們是read, readv, preadv, sendfile, 和copy_file_range; add_rchar您可以使用in查看累積的統計資訊fs/read_write.c

記憶體映射文件的 I/O 完全不同;/proc/${pid}/stat閱讀時,它依賴於頁面錯誤處理,並進行了許多優化以提高性能(預讀等)。您可以通過查看(欄位 10 和 12)中的頁面錯誤在某種程度上跟踪它。困難的部分是弄清楚每個頁面錯誤讀取了多少數據;我的實驗表明每個故障 64KiB,但我還沒有找到支持它的硬數據(這可能取決於具體情況)。

從程序的角度來看,我不知道有任何現成的跟踪映射 I/O 的方法(讀入程序的字節,無論是否實際發生了任何塊 I/O)。

準確計算記憶體映射讀取是一個相當棘手的問題,主要是因為計算必須反映意圖的方式。io計算程序明確要求讀取或寫入的字節數;但是當一個程序將一個文件映射到它的記憶體中時,讀取發生的粒度由核心決定,而不是讀取程序。你可以每 4KiB 讀取一個字節,核心會為你讀取整個文件——會計應該反映什麼?它不能輕易地反映程序在記憶體中實際讀取的字節數,這會產生巨大的性能影響(除了不可能在所有架構中實現之外)。

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