Linux kernel 带有MADV_顺序调用的madvise系统调用花费的时间太长,无法完成

Linux kernel 带有MADV_顺序调用的madvise系统调用花费的时间太长,无法完成,linux-kernel,system-calls,mmap,Linux Kernel,System Calls,Mmap,在我的代码中,我使用一个外部C库,该库调用madvise with MADV_SEQUENTIAL选项,这需要很长时间才能完成。在我看来,只给madvise打电话就足够了。我的第一个问题是,为什么要进行多个madvise系统调用,用不同的选项顺序调用madvise是否有逻辑?我的第二个问题是,你知道为什么madvise和MADV_顺序花的时间太长,有时大约1-2分钟吗 [root@mymachine ~]# strace -ttT my_compiled_code ... 13:11:35.35

在我的代码中,我使用一个外部C库,该库调用madvise with MADV_SEQUENTIAL选项,这需要很长时间才能完成。在我看来,只给madvise打电话就足够了。我的第一个问题是,为什么要进行多个madvise系统调用,用不同的选项顺序调用madvise是否有逻辑?我的第二个问题是,你知道为什么madvise和MADV_顺序花的时间太长,有时大约1-2分钟吗

[root@mymachine ~]# strace -ttT my_compiled_code
...
13:11:35.358982 open("/some/big/file", O_RDONLY) = 8 <0.000010>
13:11:35.359060 fstat64(8, {st_mode=S_IFREG|0644, st_size=953360384, ...}) = 0 <0.000006>
13:11:35.359155 mmap2(NULL, 1073741824, PROT_READ, MAP_SHARED, 8, 0) = 0x7755e000 <0.000007>
13:11:35.359223 madvise(0x7755e000, 1073741824, MADV_NORMAL) = 0 <0.000006>
13:11:35.359266 madvise(0x7755e000, 1073741824, MADV_RANDOM) = 0 <0.000006>
13:11:35.359886 madvise(0x7755e000, 1073741824, MADV_SEQUENTIAL) = 0 <0.000006>
13:11:53.730549 madvise(0x7755e000, 1073741824, MADV_RANDOM) = 0 <0.000013>
...

目前的问题太广泛了,请发布一些相关代码。举个简单的例子就好了。库是近源代码,所以我看不到库中有什么,在库中执行的这个调用会阻塞我的代码。你至少能显示
strace-ttT
的输出吗?我已经编辑了这个问题并添加了strace-ttT输出,你确定是
madvise
调用花费了1-2分钟吗?这只是对内核如何处理内存范围的一个提示。此外,您正在分配1gb的内存,因此可能会有一些页面被调出,从而导致速度减慢?
[root@mymachine ~]# free -lk
             total       used       free     shared    buffers     cached
Mem:       4034412    3419344     615068          0      55712     767824
Low:        853572     495436     358136
High:      3180840    2923908     256932
-/+ buffers/cache:    2595808    1438604
Swap:      4192960     218624    3974336


[root@mymachine ~]# cat /proc/buddyinfo 
Node 0, zone      DMA     89     23      9      4      5      4      4      1      0      2      0 
Node 0, zone   Normal   9615   7099   3997   1723    931    397     78      0      0      1      1 
Node 0, zone  HighMem   7313   8089   2187    420    206     92     41     15      8      3      6