我已经使用 python、selenium 和多处理构建了一个 Web 爬取解决方案,该解决方案部署在 EC2 实例 (m4.2xlarge 类型) 中的 docker 容器中。每当我使用大量输入运行它时,它都会在开始时使用指定数量的 CPU 线程,直到大约 1000 个 URL,之后它开始使用较少数量的线程,因此爬取变得非常慢。
寻找一种调试方法来了解为什么程序随着时间的推移开始使用更少的 CPU 线程/核心。
答案1
根据“逻辑”回答:
解决问题:设置最大线程数的限制?
原因:
任务/进程/线程切换的效率很可能在某些(未定义的)层面上存在效率限制。
从以上内容中,我得出结论,它在您的 VM/OS/硬件组合上达到了 1000 多个线程的峰值;其他人可能会在不同的级别看到它 - 具体取决于实际情况。
在您启动进程之前,操作系统已经运行了大量的进程实例。
答案2
如果程序在没有充分利用 CPU 能力的情况下变慢,那么它一定是遇到了其他瓶颈。它可能是 RAM、磁盘 I/O 或网络 I/O,或者是某些硬编码的系统限制,例如打开文件描述符的最大数量(在类 Unix 系统上)。
即使不查看软件内部,您也可以调查您的机器或进程是否达到这些限制。Linux 有很多工具可以实现这一点,/proc
文件系统中也有很多 jnfo。
所以我会从这里开始。另一种方法是使用诸如(在 Linux 上)之类的工具来跟踪或分析软件,strace
并确定是否有任何系统调用花费的时间比预期的要长得多。