Windows 台式机通过 1GB 以太网电缆连接到装有 Ubuntu 的个人 NAS(正在开发)。在从 NAS 读取和写入文件(> 1GB 大小)时,strace 是用来监视 samba 进程的系统调用的,因为 samba 正在做艰苦的工作。
下面是 strace 输出的一小部分:
mmap2(NULL, 1052672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb4eaf000 <0.000075>
pread(31, "\255\343.\372e\357F\315\357\247\21o{\331\223\336\216\235\367\\#L\312\220W\323\226\303\302\21\35\336"..., 1048576, 13631488) = 1048576 <0.010848>
writev(34, [{"\3261\347S\205\2\347\325\316\325\214LT{\337\256!\351\246\266\342b\204i\347\221:x$\r\5\227"..., 999020}], 1) = 49640 <0.000451>
gettimeofday({6146, 475882}, NULL) = 0 <0.000282>
gettimeofday({6146, 476842}, NULL) = 0 <0.000152>
poll([{fd=10, events=POLLIN|POLLHUP}, {fd=6, events=POLLIN|POLLHUP}, {fd=8, events=POLLIN|POLLHUP}, {fd=34, events=POLLIN|POLLOUT|POLLHUP}], 4, 57236) = 1 ([{fd=34, revents=POLLOUT}]) <0.000202>
这一直持续到所有读取的字节都写入缓存,之后,新的 pread
系统调用随之而来,依此类推。 (在mmap2
-ed 内存未映射之前)
我注意到,后来调用的writev
函数返回越来越大的字节数,例如
mmap2(NULL, 1052672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb4eaf000 <0.000304>
pread(31, "\343\367\235\227Q;\3717\240<\nl\326ff\0\361 J\37\253T\247\352\207\376\372\273\341\360\370y"..., 1048576, 458227712) = 1048576 <0.032897>
writev(34, [{"\t\21\6\301\366hPq\274\373\353x\332X\377\310\275<J\4z\261\0\227\24\230\256\350\300\16\355\203"..., 674900}], 1) = 373760 <0.002618>
gettimeofday({6164, 906348}, NULL) = 0 <0.000149>
gettimeofday({6164, 907318}, NULL) = 0 <0.000149>
poll([{fd=10, events=POLLIN|POLLHUP}, {fd=6, events=POLLIN|POLLHUP}, {fd=8, events=POLLIN|POLLHUP}, {fd=34, events=POLLIN|POLLOUT|POLLHUP}], 4, 38805) = 1 ([{fd=34, revents=POLLOUT}]) <0.000199>
- 为什么会发生这种情况?是否取决于 I/O 调度程序?使用的I/O调度器是ROW。
我可以以某种方式影响读写 I/O块大小?我想加快速度,所以为什么不从大的开始
writev
块大小从一开始就。如果块大小pread
是和函数返回值的正确名称writev
。很难区分术语,因为显然有块大小对于文件以及块大小对于磁盘。dd
例如,当我使用时,我是否通过bs
参数影响文件块大小?自盘块大小由格式化时间决定,无法即时更改。最后,我可以以某种方式阻止
gettimeofday
函数调用,因为我认为没有必要,或者我错了?
很抱歉,如果有些问题暴露了我对知识的严重缺乏,但我确实在努力清除所有术语以及我迈向 Linux 领域的小步。