Arangodb CPU 性能差异,而 运行 2 台不同机器上的相同应用程序
Arangodb CPU Performance differences while running the same application on 2 separate machine
我开发了一个 foxx 应用程序,它在机器 A 上 运行。cpu 利用率通常低于 3-4%,有时会飙升至 20%。我有将近 600 万条记录。
相同的应用程序部署在另一台机器上(机器 A 的精确副本)并且只有大约 100k 的数据,但是 cpu 利用率约为 200%。
我该如何调试它。机器 B 上发生了什么。两台机器具有相同的应用程序、相同的 arangodb 版本、相同的配置。磁盘I/O也是一样,机器B的内存使用率是机器A的1/6。
任何指针。这是在生产环境中发生的,所以快速调试它对我来说非常重要。
我们终于能够自己重现这样的问题。我们发现有一种情况,调度程序线程可能会进入一些繁忙的等待状态,导致以下循环一遍又一遍地执行:
- 调度程序线程调用
epoll_wait()
epoll_wait()
return立即发送,为某个文件描述符发出事件信号
- 正在调用正确的事件处理回调,但没有从监视描述符列表中删除文件描述符
- 转到 1
由于未从监视描述符列表中正确清除一个文件描述符,epoll_wait()
始终发出一个事件信号,要求文件描述符可用。这使得它几乎立即 return ,并且整个上面的循环每秒执行多次。
这导致名为 scheduler
的线程出现 CPU 峰值。
我们发现一个原因是客户端连接超时,而连接触发的操作仍在服务器端操作上执行。例如,如果客户端调用服务器路由需要 5 秒才能完成并响应,但客户端在 3 秒后断开连接,则可能发生了这种情况。
是什么让它难以重现,因为它不会影响所有此类客户端连接,但只会影响一些 - 哪些仍然不清楚。
此问题已在 ArangoDB 2.6.5 中修复,因此您可能想在发布时尝试一下。
我开发了一个 foxx 应用程序,它在机器 A 上 运行。cpu 利用率通常低于 3-4%,有时会飙升至 20%。我有将近 600 万条记录。
相同的应用程序部署在另一台机器上(机器 A 的精确副本)并且只有大约 100k 的数据,但是 cpu 利用率约为 200%。
我该如何调试它。机器 B 上发生了什么。两台机器具有相同的应用程序、相同的 arangodb 版本、相同的配置。磁盘I/O也是一样,机器B的内存使用率是机器A的1/6。
任何指针。这是在生产环境中发生的,所以快速调试它对我来说非常重要。
我们终于能够自己重现这样的问题。我们发现有一种情况,调度程序线程可能会进入一些繁忙的等待状态,导致以下循环一遍又一遍地执行:
- 调度程序线程调用
epoll_wait()
epoll_wait()
return立即发送,为某个文件描述符发出事件信号- 正在调用正确的事件处理回调,但没有从监视描述符列表中删除文件描述符
- 转到 1
由于未从监视描述符列表中正确清除一个文件描述符,epoll_wait()
始终发出一个事件信号,要求文件描述符可用。这使得它几乎立即 return ,并且整个上面的循环每秒执行多次。
这导致名为 scheduler
的线程出现 CPU 峰值。
我们发现一个原因是客户端连接超时,而连接触发的操作仍在服务器端操作上执行。例如,如果客户端调用服务器路由需要 5 秒才能完成并响应,但客户端在 3 秒后断开连接,则可能发生了这种情况。 是什么让它难以重现,因为它不会影响所有此类客户端连接,但只会影响一些 - 哪些仍然不清楚。
此问题已在 ArangoDB 2.6.5 中修复,因此您可能想在发布时尝试一下。