[英]memory mapped file access is very slow
我正在使用976 GB內存的Linux機器上寫入930GB文件(預分配)。
該應用程序是用C ++編寫的,我正在使用Boost Interprocess對文件進行內存映射。 在開始代碼之前,我先設置堆棧大小:
ulimit -s無限
一個星期前寫作非常快,但是今天運行緩慢。 我不認為代碼已更改,但是我可能不小心更改了環境中的某些內容(它是一個AWS實例)。
應用程序(“ write_data”)似乎並未使用所有可用內存。 “頂部”顯示:
Tasks: 559 total, 1 running, 558 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni, 98.5%id, 1.5%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1007321952k total, 149232000k used, 858089952k free, 286496k buffers
Swap: 0k total, 0k used, 0k free, 142275392k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4904 root 20 0 2708m 37m 27m S 1.0 0.0 1:47.00 dockerd
56931 my_user 20 0 930g 29g 29g D 1.0 3.1 12:38.95 write_data
57179 root 20 0 0 0 0 D 1.0 0.0 0:25.55 kworker/u257:1
57512 my_user 20 0 15752 2664 1944 R 1.0 0.0 0:00.06 top
我以為常駐大小(RES)應該包括內存映射數據,所以它不應該> 930 GB(文件大小)嗎?
有人可以建議診斷問題的方法嗎?
通常不急於填充內存映射。 如果有其他程序將文件強制進入頁面緩存,則從一開始就可以看到良好的性能,否則,將在文件被分頁時看到較差的性能。
如果您有足夠的RAM將整個文件保存在內存中,則可能需要向操作系統提示它應該預取文件,從而減少由頁面錯誤觸發的小批量讀取的數量,從而代替了大批量讀取。 通過傳遞POSIX_MADV_WILLNEED
作為advice
,可以使用posix_madvise
API提供此提示,指示它應該預取整個文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.