【问题标题】:Why getnameinfo with multi-thread so slow?为什么多线程的getnameinfo这么慢?
【发布时间】:2015-01-06 13:43:24
【问题描述】:

我想通过在 Linux 中调用 getnameinfo() 来解析主机名。为了加快进程,我使用线程池来解析主机名。
但问题是,一开始速度很快,然后逐渐降低。过了一会,一个线程的速度就接近了。有时这个函数需要 3 秒,所有线程看起来都按顺序运行。
我对此感到困惑。 getnameinfo() 函数中是否有任何锁定机制?

【问题讨论】:

  • 线程是怎么调用的,用什么方式,用什么参数?你的 DNS 服务器是什么?
  • 您是如何确定花费在系统调用上的时间而不是您自己的代码的?
  • 参数只是线程数组的索引。每个线程都有一个while循环。在 while 块中,程序随机生成 IP 地址并调用 getnameinfo() 来解析 IP。我只是计算所有线程中的循环并每 10 秒打印一次速度。此外,我的 DNS 服务器是由本地网络提供商提供的。

标签: c++ multithreading resolve


【解决方案1】:

“按顺序运行的线程”强烈建议是您的锁定或请求调度导致了这种情况。如果您认为这是一个锁,那么闯入调试器应该可以轻松地让您在锁定时捕获调用堆栈。

【讨论】:

  • 在测试程序中,没有锁。我发现速度是每秒 200-400 个 IP 地址,有 5 个线程。这是最大速度。我将线程数添加到10、50、100和200,速度不再增加。
  • 而你每秒调用 200 个地址 slow ?!我认为这里的问题是不切实际的期望。
猜你喜欢
  • 1970-01-01
  • 2010-10-05
  • 2023-03-21
  • 2014-07-21
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多