簡體   English   中英

內存映射文件訪問非常慢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM