写了一个程序检查文件,写了一个shell是遍历目录,每检出一个文件就让程序来检查文件。
感觉运行时CPU只用了一个核,于是想改写shell成多进程,利用多个核。采用 & 将每个文件检测推入后台,打算让系统自己调度。
使用&之后,top发现每个核利用都大了好多,但是总时长反而比不推入后台还慢甚至很多。
由于遍历目录文件众多,虽然shell是逐个推入,由于shell只是挑出文件,因为文件数还是非常大,必然导致资源耗尽,处于等待退出进入这样调度的循环。
【 并不打算去修改系统关于资源的限制,参见
limit资源限制ulimit 详解_ulimit -a命令时,statck size-CSDN博客
】
也许是文件检测比较快,进程推入后台调度切换花费的时间更长。
也许是硬盘读取多进程效率低?cpu也只有4个核。生成内存盘,mount -t ramfs myramdisk /tmp/ramdisk。结果基本一致。
也曾利用管道,mkfifo, exec 3<>/tmp/xxx,按cpu核数发取令牌,检查程序放入后台,仍然比单核顺行执行慢。可能是read堵塞效率不高,或者是令牌数过少?
运行数值:建立ramdisk,单核顺行 29s;全部(1.7万多个文件)推入后台68s;4个令牌72s;128个令牌71s;208个令牌72s。
不发令牌推入后台每128个,休息0.001s,结果是71s;推入后台每1024个,sleep(shell)休息0.001s,结果是72s。
这个命令可以达到20s
find /tmp/ramdisk/ -type f|xargs -P 4 -I file bash -c ' { ./quanling "file" ; if [ $? -eq 0 ] ; then echo "file" ; fi } ' 采用-P 8也基本是20s左右。
我的目标是单核顺行29s,采用&推入后台利用多核,减少运行时间,经过多次试验,主代码如下:
if [ $(($SUMTOTAL % 100)) -eq 0 ] ; then
wait
fi
./quanling "$dir_or_file" & 【检测程序】
抱歉没有记下来是哪位写的一般的系统也就是开300个进程左右,我试了1000和200还有100,基本都是15s左右。
基本达到第一级目的,时间缩半。哪位有类似经验,欢迎交流。