驭风万里无垠

pipeline会启动多少个进程?

最近在TL的讨论中忽然有人挑起了perl和python(一场关于c++的讨论扯到脚步上还有不少的碰撞,倒是挺有意思),我则有感而发的想起了前几天面试的时候问别人的一个基本的shell问题:

cat xxx.txt | grep "yyy" | wc –l

问题是这个常见的pipeline操作一般最少会起多少个进程?结果那位老兄倒是愣了半天然后目无表情。

我只好继续唠叨的解释了一下一般pipe的操作需要读取一个进程的输入,然后将输出送给下一个进程;其实我希望对方干脆利落的回答是有3个,这个问题就算是可以了;我们主要不是用脚本开发,但是如果有这个技能是能得到额外的认可的。

 

TL上的大虾们果然是想法众多,立马有人站出来问:我想知道答案是几个?直接让我怀疑是不是我的脑袋有问题。后来有人给出了可能是2个的情形:

      某个变态的shell可能内置了cat,使其成为一个builtin,然后自己越俎代庖的读取标准输入,并且将内容文本输出,那么进程就少一个。

起初我觉得这个解释并不能成立,但是经过几个老大的解释还是明白了他所说的情况是shell的builtin。

 

中间又讨论起那些可能是builtin的command,举出的例子是cd/kill/time,但是我查了一下Solaris上的,后两个都是executable,cd找到一个/usr/bin/cd 的ksh,内容如下:

#!/bin/ksh
command = `basename $0`
$command $@
这个结果本来还是挺出乎我的意料的,于是我也想当然的认为,shell里边不能直接调用syscall;
很快就得证这个揣测纯粹是错误的;以前还真没想过这个问题,查了下wikipedia、google之后得到很多意料之外的收获。
 
最后居然有人搬出了busybox这个大旗(做过嵌入式的大多都知道些),并声称它把vi也builtin了。
这下也很出乎我的意料,不顾我没有仔细研究过,没有什么发言权。
不过最后有人站出来说,busybox并没有内置这些想当然的vi,而是大部分也单独起进程了;在Unix的哲学里边,做这些大而全的东西其实是不被鼓励的,因为它违反unix的哲学。
 
话说回来,面试的时候,我之所以会问到这样的问题,也是有很真实的background的。曾经我们查过的一个很诡异的performance bottleneck就是由于shell脚步的问题引起的。
====================================================================================================
问题本身也是比较直观的(当然是“事后诸葛”了):
     某段程序的启动脚本使用如下的东东来检测环境:
exists=`netstat -rn | grep "xx.xx.xx.xx" | wc -l`
if [ $exists -eq 0 ];then
     idx=`ifconfig -an | grep bge0 | awk -F":" '{print $2}' | uniq | sort | tail`"
     ifconfig bge0:`echo $idx + 1 | bc` plumb up
     ifconfig bge0:`echo $idx + 1 | bc` xx.xx.xx.xx netmask 255.255.255.0
fi
  

当有很多个同样的进程(>500)恰好于同一时刻跑到这个初始化点的时候,如果系统上已经存在的IP地址很多(当时的场景大概有2000+),那么netstat、ifconfig本身都变得非常耗时,加上多个进程的原因,系统中会有N多个进程在消耗着资源;

后果的严重程度是任何shell都停止响应,数十分钟都陷入假死,不得不重启电源了事。

当然的分析结果发现,真正占用的CPU都是处于kernel状态的,并且使用率超过99%,长长的pipeline带来的开销,相当一部分可能来源于互相等待CPU的进程的互相抢占。

解决的方法自然也很简单,这里不赘述了。

=========================================================================

当时以为对这个问题搞得算是比较明白了,结果拿出来一讨论,发现自己不了解的还真不少。

posted on 2009-12-14 19:46 skyscribe 阅读(458) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


<2009年7月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

导航

统计

常用链接

留言簿(3)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜