linux 高CPU负载使得接收NFQUEUE数据包的速度更快

bgibtngc  于 2023-04-20  发布在  Linux
关注(0)|答案(1)|浏览(204)

我使用libmnl来接收指向用户空间的数据包,iptables为“-j NFQUEUE”。

for (;;) {
        ret = mnl_socket_recvfrom(nl, buf, sizeof_buf);
        if (ret == -1) {
            perror("mnl_socket_recvfrom");
            exit(EXIT_FAILURE);
        }
        ret = mnl_cb_run(buf, ret, 0, portid, queue_cb, nl);
        if (ret < 0){
            perror("mnl_cb_run");
            exit(EXIT_FAILURE);
        }
    }

已经观察到mnl_socket_recvfrom()在接收到数据包时不会立即返回。发生了高达100 ms的延迟。为了排除故障,我使用ping并试图占用CPU来引起延迟。但令我惊讶的是,当CPU占用开始时,延迟 * 下降 *!

64 bytes from 10.0.0.0: icmp_seq=120 ttl=63 time=1.08 ms
64 bytes from 10.0.0.0: icmp_seq=121 ttl=63 time=1.26 ms
64 bytes from 10.0.0.0: icmp_seq=122 ttl=63 time=1.15 ms
64 bytes from 10.0.0.0: icmp_seq=123 ttl=63 time=1.26 ms
64 bytes from 10.0.0.0: icmp_seq=124 ttl=63 time=1.24 ms
64 bytes from 10.0.0.0: icmp_seq=125 ttl=63 time=0.627 ms <--- CPU hog started
64 bytes from 10.0.0.0: icmp_seq=126 ttl=63 time=0.334 ms
64 bytes from 10.0.0.0: icmp_seq=127 ttl=63 time=0.628 ms
64 bytes from 10.0.0.0: icmp_seq=128 ttl=63 time=0.599 ms
64 bytes from 10.0.0.0: icmp_seq=129 ttl=63 time=0.602 ms

有人能解释这一点吗?
测试是在一个有一个(虚拟)CPU的kvm VM上进行的。nfqueue程序以正常的prio运行,并发送裁定接受和fwmark来转发所有数据包(在本例中为icmp)。CPU-hog是以正常的prio还是nice -20 prio运行并不重要。
hog被写成i C,而且完全是哑巴:

unsigned long i = 0;
        for (;;) {
                i++;
        }
cotxawn7

cotxawn71#

这是因为CPUfreq governor“ondemand”根据当前系统负载设置CPU频率。当您运行ping命令时,CPU频率会增加。解决方案可能是通过此命令将CPU频率设置为最高频率:

cpupower frequency-set --governor performance

相关问题