我们的服务器解决方案使用以下方式处理许多隧道操作请求(添加/更新/删除)读写控制接口和 AF_INET 地址族套接字。大约。数字为 100 次操作/分钟,服务器上总共有超过 8k 条隧道。
随着隧道数量的增加,我们观察到了一种奇怪的行为 - 随着隧道数量的增加,ioctl 在内核中花费的时间的随机性也会增加。
例子:大约 100 条隧道,平均。 ioctl 操作时间范围为 100 到 150 ms,但超过 2000 时范围为 100 到 10000 ms。这个过程的随机性令人惊讶。
斯特雷斯显示超过 97% 的进程时间都花在 ioctl 上,并且内部计时器证实了这一点。
有什么方法可以优化这个吗?也许通过调整内核参数(哪些)?如何解释随机性?
我们的操作系统是 Ubuntu Server 12.04。
答案1
原来ioctl在这里并没有罪。斯特雷斯表明确实如此,但对内核进行了更深入的分析追踪(或者跟踪命令)表明,在读写控制处理器调度程序导致核心/上下文切换期间的大部分速度减慢。