bash线程限制

时间:2012-11-11 12:00:42

标签: linux multithreading bash

我有项目使用clamAV签名数据库对病毒扫描程序进行编码。 为了提高速度,我使用线程。 (组合&等待) 我的代码如何工作:

它读取文件夹和子文件夹中的所有文件

function recursive_files()
{
files=$(find $folder_path -type f)
for f in $files
do
    raw_and_scan "$f" &
done
wait
}

如您所见,每个文件都有一个帖子。

function raw_and_scan()
{
raw_test_file $1
read_signature_db_by_line $1
}

Read_signature ..读取签名数据库的每一行

    function  read_signature_db_by_line()
    {
    cat $signature_path | (while read LINE ; do
        stringtokenizer_line_db $LINE $1 $raw_file &
    done
    wait
    )  }

如您所见,对于每一行数据库都有一个主题。

我做了双线程实现,因为我看到了巨大的性能(使用时间基准)

当我将50行50个文件扫描到数据库中时。它工作正常。

但是当我扫描我的主文件夹(800个文件)时它不起作用,更糟糕的是我收到了警告(不能再用fork())并且我的计算机冻结了,它需要重新启动。

我观察过程(htop),直到它完成5000个任务。

您可以提交我的项目https://github.com/peondusud/Bash.antivir

最后,我会用数据库65000行扫描文件夹。

如果您有任何想法限制线程或类似的东西。

感谢。

1 个答案:

答案 0 :(得分:1)

事实上,你看到从一个进程(而不是线程)到两个进程的巨大进步并不意味着你将使用5000个进程超快速地进行!实际上情况恰恰相反 - 如果您计划让流程进行密集型工作,您应该将其限制为系统中2 *个cpu核心数(这是一般的经验法则)