real0m0 .596suser 0m0 .001ssys 0m0 .919s
# 第二种重定向方式$ time (./b.out
real0m0 .151suser 0m0 .000ssys 0m0 .147s
从执行时间数看出来速度有3倍左右的差别了,第二种明显快很多。
是不是有点奇怪?好吧我们来从原来上面分析下,还是继续用数据说话:
这次准备个很小的数据文件,方便观察然后在一个窗口运行stap
$ echo hello > huge_dump.sql$ sudo stap test.stp:~0bash( 26570): -> sys_read0bash( 26570): -> sys_read0bash( 26570): -> sys_write0bash( 26570): -> sys_read0bash( 26570): -> sys_write0bash( 26570): -> sys_close0bash( 26570): -> sys_pipe0bash( 26570): -> sys_pipe0bash( 26570): -> do_fork0bash( 26570): -> sys_close0bash( 26570): -> sys_close0bash( 26570): -> do_fork0bash( 13775): -> sys_close0bash( 13775): -> sys_read0bash( 13775): -> pipe_read: file ino 209069110bash( 13775): -> pipe_readv: file ino 209069110bash( 13776): -> sys_close0bash( 13776): -> sys_close0bash( 13776): -> sys_close0bash( 13776): -> do_execve0bash( 26570): -> sys_close0bash( 26570): -> sys_close0bash( 26570): -> sys_close0bash( 13775): -> sys_close0bash( 26570): -> sys_wait40bash( 13775): -> sys_close0bash( 13775): -> sys_close0b. out( 13776): -> sys_close0b. out( 13776): -> sys_close0bash( 13775): -> do_execve0b. out( 13776): -> sys_open0b. out( 13776): -> sys_close0b. out( 13776): -> sys_open0b. out( 13776): -> sys_read0b. out( 13776): -> sys_close0cat( 13775): -> sys_close0cat( 13775): -> sys_close0b. out( 13776): -> sys_read0b. out( 13776): -> pipe_read: file ino 209069100b. out( 13776): -> pipe_readv: file ino 209069100cat( 13775): -> sys_open0cat( 13775): -> sys_close0cat( 13775): -> sys_open0cat( 13775): -> sys_read0cat( 13775): -> sys_close0cat( 13775): -> sys_open0cat( 13775): -> sys_close0cat( 13775): -> sys_open0cat( 13775): -> sys_read0cat( 13775): -> sys_write0cat( 13775): -> pipe_write: file ino 209069100cat( 13775): -> pipe_writev: file ino 209069100cat( 13775): -> sys_read0b. out( 13776): -> sys_read0b. out( 13776): -> pipe_read: file ino 209069100b. out( 13776): -> pipe_readv: file ino 209069100cat( 13775): -> sys_close0cat( 13775): -> sys_close0bash( 26570): -> sys_wait40bash( 26570): -> sys_close0bash( 26570): -> sys_wait40bash( 26570): -> sys_write
stap在收集数据了,我们在另外一个窗口运行管道的情况:
$cat huge_dump.sql|./b.out
我们从systemtap的日志可以看出:
bash fork了2个进程。
然后execve分别运行cat 和 b.out进程, 这二个进程用pipe通信。
数据从由cat从 huge_dump.sql读出,写到pipe,然后b.out从pipe读出处理。
那么再看下命令2重定向的情况:
$./b.out < huge_dump.sqlstap输出:0bash(26570): -> sys_read0bash(26570): -> sys_read0bash(26570): -> sys_write0bash(26570): -> sys_read0bash(26570): -> sys_write0bash(26570): -> sys_close0bash(26570): -> sys_pipe0bash(26570): -> do_fork0bash(28926): -> sys_close0bash(28926): -> sys_read0bash(28926): -> pipe_read: file ino 209209020bash(28926): -> pipe_readv: file ino 209209020bash(26570): -> sys_close0bash(26570): -> sys_close0bash(26570): -> sys_wait40bash(28926): -> sys_close0bash(28926): -> sys_open0bash(28926): -> sys_close0bash(28926): -> do_execve0b.out(28926): -> sys_close0b.out(28926): -> sys_close0b.out(28926): -> sys_open0b.out(28926): -> sys_close0b.out(28926): -> sys_open0b.out(28926): -> sys_read0b.out(28926): -> sys_close0b.out(28926): -> sys_read0b.out(28926): -> sys_read0bash(26570): -> sys_wait40bash(26570): -> sys_write0 bash(26570): -> sys_read
bash fork了一个进程,打开数据文件。
然后把文件句柄搞到0句柄上,这个进程execve运行b.out。
然后b.out直接读取数据。
现在就非常清楚为什么二种场景速度有3倍的差别:
命令1,管道方式:读二次,写一次,外加一个进程上下文切换。
命令2,重定向方式:只读一次。
结论 :Linux下大文件重定向效率更高。返回搜狐,查看更多