我最近启动了一个 Web 应用程序,该应用程序的 CPU 占用率一直保持在 100%。我的服务器是一台 512 MB 的 Linode,带有 nginx,位于 Apache(MPM Worker)前面,为 Django 应用程序提供服务。这个应用程序很不寻常,因为它必须在不到 5% 的时间内(~2-5k 个查询/请求)进行繁重的数据库处理。我目前只有少数用户(每天 50 个,任何给定时间大约 5-10 个)。现在我明白进行几千个查询是过分的,我正在研究优化它,但我不明白为什么 Apache 进程会达到 100% 并保持在那里,即使目前没有人访问这个高负载页面。
这是我的 Apache 配置的一部分:
<IfModule mpm_worker_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
以下是我从“top”中摘选的几行:
10257 www-data 20 0 370m 143m 4052 S 100 29.0 16:19.47 apache2
1 root 20 0 2728 224 24 S 0 0.0 0:01.34 init
2 root 20 0 0 0 0 S 0 0.0 0:00.00 kthreadd
任何帮助将非常感激!
答案1
事实证明这不是服务器问题。有一个特定的代码路径非常耗费 CPU(最坏情况下是 O(n^2) 操作)。我通过联系遇到问题的特定测试用户并将他们的数据复制到我的临时服务器并进行测试来追踪问题。我能够重现它并从那里修复它。
我仍然想知道为什么当用户停止其连接时,Apache 请求会继续处理该请求。