linux中断sql效率,Linux大文件重定向和管道的效率对比

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下大文件重定向效率更高。返回搜狐,查看更多

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值