為什麼 /proc/ 中忽略 memmap IO磷一世D磷一世DPID/io
我有問題 /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 讀取一個字節,核心會為你讀取整個文件——會計應該反映什麼?它不能輕易地反映程序在記憶體中實際讀取的字節數,這會產生巨大的性能影響(除了不可能在所有架構中實現之外)。