我正在为即将推出的视频游戏《博德之门 3》主持一个非盈利社区维基。由于这款游戏看起来可能会有数百万玩家,我们开始担心服务器容量。
我使用的是 Apache 2.4.57(最新稳定版本),mpm_event.conf
现在使用以下内容,可能会进一步更改:
ServerLimit 8
StartServers 2
ThreadLimit 32
ThreadsPerChild 32
MaxRequestWorkers 256
MinSpareThreads 32
MaxSpareThreads 128
MaxConnectionsPerChild 0
因此,Apache 任何时候都应最多拥有 256 个工作线程。加上每个 MPM 进程的 8 个主线程和一个根主进程,我们总共可获得265。(可能因为其他原因还会多几个,但无论如何最大数额应该在这个范围内。)
然而,当我激活最大负载( )并看到由256 个工作线程ab -n 1500 -c 500 <url>
提供服务的状态页面时,该命令返回了一个惊人的mod_status
pgrep -wc apache
632。
我也使用过命令pgrep -wal apache | wc -l
并ps -eL | grep -c apache
得到了几乎相同的结果,所以我认为我的 apache 线程计数方法应该是准确的?
对此该如何解释呢?
我的系统上的最大线程数受我的“VPS”(不是真正的 VPS,而是一个便宜的容器)限制,总共为 1100 个,因此对我来说,了解 Apache 在给定配置下实际将创建多少个线程非常重要。
这可能与 PHP FPM 有关吗?我的 FPMpool.d/www.conf
当前包含以下内容(尚未调整以匹配设置mpm_event
):
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
即使每个 worker 都有一个与 PHP 相关的额外线程,这也将为我们提供 512 个线程,再加上前面提到的其他几个线程(MPM 主线程 + 根进程线程),总共521,因此仍有 112 个线程未被考虑。
PHP版本是8.1.2-1ubuntu2.13。