执行命令行管理程序命令时出现性能问题

Performance Issue in Executing Shell Commands

本文关键字:性能 问题 命令行 管理程序 命令 执行      更新时间:2023-10-16

在我的应用程序中,我需要通过 c++ 代码执行大量的 shell 命令。我发现该程序需要 30 多秒才能执行 6000 个命令,这太不可接受了!有没有其他更好的方法来执行 shell 命令(使用 c/c++ 代码(?

    //Below functions is used to set rules for 
    //Linux tool --TC, and in runtime there will 
    //be more than 6000 rules to be set from shell
    //those TC commans are like below example:
    //tc qdisc del dev eth0 root 
    //tc qdisc add dev eth0 root handle 1:0 cbq bandwidth 
    //   10Mbit avpkt 1000 cell 8
    //tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth
    //   100Mbit rate 8000kbit weight 800kbit prio 5 allot 1514 
    //   cell 8 maxburst 20 avpkt 1000 bounded
    //tc class add dev eth0 parent 1:0 classid 1:2 cbq bandwidth 
    //   100Mbit rate 800kbit weight 80kbit prio 5 allot 1514 cell 
    //   8 maxburst 20 avpkt 1000 bounded
    //tc class add dev eth0 parent 1:0 classid 1:3 cbq bandwidth 
    //   100Mbit rate 800kbit weight 80kbit prio 5 allot 1514 cell 
    //   8 maxburst 20 avpkt 1000 bounded
    //tc class add dev eth0 parent 1:1 classid 1:1001 cbq bandwidth 
    //   100Mbit rate 8000kbit weight 800kbit prio 8 allot 1514 cell 
    //   8 maxburst 20 avpkt 1000
    //......
    void CTCProxy::ApplyTCCommands(){
        FILE* OutputStream = NULL;        
        //mTCCommands is a vector<string>
        //every string in it is a TC rule               
        int CmdCount = mTCCommands.size();
        for (int i = 0; i < CmdCount; i++){            
            OutputStream = popen(mTCCommands[i].c_str(), "r");
            if (OutputStream){
                pclose(OutputStream);
            } else {
                printf("popen error!n");
            }     
        }
    }

更新
我尝试将所有 shell 命令放入 shell 脚本中,并让测试应用程序使用 system("xxx.sh"( 调用此脚本文件。这一次,执行所有 6000 个 shell 命令条目需要 24 秒,比我们之前需要的要少。但这仍然比我们预期的要大得多!有没有其他方法可以将执行时间减少到 10 秒以下?

因此,最有可能(根据我在类似类型事情上的经验(,大部分时间都花在启动运行 shell 的新进程上,在 shell 中执行实际命令的时间非常短。(实际上,30 秒内的 6000 听起来并不太可怕(。

有多种方法可以做到这一点。我很想尝试将它们全部合并到一个 shell 脚本中,而不是运行单独的行。这将涉及将所有"tc"字符串写入文件,然后将其传递给popen((。

另一个想法是,如果你真的可以将几个字符串组合成一个执行,也许?

如果命令完整且可直接执行(即不需要 shell 来执行程序(,您也可以自己做forkexec。这将节省创建 shell 进程,然后创建实际进程。

此外,您可以考虑并行运行少量进程,这在任何现代计算机上都可能会通过您拥有的处理器内核数量来加快速度。

你可以启动shell(/bin/sh(并在那里通过管道传输所有命令来解析输出。或者,您可以创建一个 Makefile,因为这可以让您更好地控制命令的执行方式、并行执行和错误处理。