如何检查 apache 和 php-fpm 配置是否合适(不要太高或太低)

Lex*_*aGC 4 php apache performance high-availability

我将在一个应用程序(php 基础)上举办一个有 3000 名用户的活动。

我在云中启动了多个实例并在其上安装了 LAMP。[进行负载测试并选择事件]

在 Ubuntu 18 上

在此输入图像描述

我启用了 mpm_event 和 php7.4-fpm(这似乎是 apache 和 php 应用程序高流量的更好配置)。

我用这篇文章解释了如何调整你的配置。像这样 :

这里是 apache2 mpm 事件conf:

<IfModule mpm_*_module>
  ServerLimit           (Total RAM - Memory used for Linux, DB, etc.) / process size
  StartServers          (Number of Cores)
  MinSpareThreads       25
  MaxSpareThreads       75
  ThreadLimit           64
  ThreadsPerChild       25
  MaxRequestWorkers     (Total RAM - Memory used for Linux, DB, etc.) / process size
  MaxConnectionsPerChild   1000
</IfModule>
Run Code Online (Sandbox Code Playgroud)

这里是 php7.4-fpm :

pm = dynamic            
pm.max_children         (total RAM - (DB etc) / process size)
pm.start_servers        (cpu cores * 4)
pm.min_spare_servers    (cpu cores * 2)
pm.max_spare_servers    (cpu cores * 4)
pm.max_requests         1000
Run Code Online (Sandbox Code Playgroud)

我的目标是:即使我依赖这些方法,我也会看到一些指标,例如:

  • --> 你有太多未使用的线程(来自 apache worker 或来自 phpfpm)
  • --> 您的所有线程(来自 apache worker 或来自 phpfpm)已经很忙并且正在使用

我已经测试: htop、glance、vmstat、sar 来检查 io、cpu、ram,但即使如此,我也不清楚: 我的配置是否适合具有此负载的这台机器,还是应该增加/减少某些内容? 然后我可以确定这些配置是好的并开始其他主题:CDN,缓存......

你如何处理这个?提前致谢,

Rob*_*bie 5

正如您所指出的,这取决于您的脚本。我们根据正在汇总的服务器在部署脚本中动态调整这一点。

以下脚本基于在 Centos 和 AWS 基础设施上运行 Apache,但可以轻松适应您正在使用的内容。

基本上:

  • 设置apache进程的大小
  • 设置php进程的大小
  • 脚本获取可用内存、核心并进行一些处理,然后修改配置。
  • 我们将其作为堆栈汇总的一部分运行

主要来源/基于:

脚步:

  1. 计算工艺尺寸

您需要知道您的计算机上可以运行多少个进程。因此计算你的主CPU/内存驱动程序的进程大小是必要的。

cd /tmp
curl https://raw.githubusercontent.com/pixelb/ps_mem/master/ps_mem.py --output ps_mem.py
chmod a+x ps_mem.py
sudo python ps_mem.py
# Sample numbers:
# 28.4 MiB + 103.0 KiB = 28.5 MiB memcached
# 34.7 MiB + 9.5 KiB = 34.7 MiB amazon-cloudwatch-agent
# 24.8 MiB + 18.0 MiB = 42.8 MiB httpd (15)
# 69.1 MiB + 7.0 MiB = 76.0 MiB php (2)
# 228.2 MiB + 46.0 MiB = 274.3 MiB php-fpm (36)
Run Code Online (Sandbox Code Playgroud)

在这里您可以看到有 15 个 httpd 进程,总共消耗 43MiB,因此每个 Apache 进程大约使用 3MiB 的 RAM。php-fpm 进程将使用大约 7.6MiB。

  1. 计算 Apache MaxRequestWorkers

但为了安全起见,请为所有其他进程保留 15% 的内存(在我的例子中约为 1.2GiB),并将 apache 进程大小四舍五入为 3MiB。

MaxRequestWorkers = (Total RAM - Memory used for Linux, DB, etc.) / process size
MaxRequestWorkers = (8000MB - 1200MB) / 3MB = 2,266
Run Code Online (Sandbox Code Playgroud)
  1. 计算 php-fpm max-children

但为了安全起见,请为所有其他进程保留 1 GiB,并将 php 进程大小四舍五入为 8MiB。

max_children = (Total RAM - Memory used for Linux, DB, etc.) / process size
max_children = (8000MB - 1200MB) / 8MB = 850
Run Code Online (Sandbox Code Playgroud)
  1. 这是我们在汇总时使用的脚本。
#!/bin/bash

# Creates a configuration script to run once final servers are up.
PROCESS_SIZE_APACHE_MB=3
PROCESS_SIZE_PHP_MB=8

# Get some values from the server
MEMORY_KB=`grep MemTotal /proc/meminfo | awk '"'"'{print $2}'"'"'`
MEMORY_MB=$(($MEMORY_KB / 1024))
MEMORY_AVAILABLE_MB=$(($MEMORY_KB / 1178))
NUM_CORES=`nproc --all`
echo "Memory: $MEMORY_MB MB"
echo "Memory Available: $MEMORY_AVAILABLE_MB MB"
echo "Num Cores $NUM_CORES"

#Now do some calculations
SERVER_LIMIT=$(($MEMORY_AVAILABLE_MB / $PROCESS_SIZE_APACHE_MB))
echo "HTTP MPM Server Limit: $SERVER_LIMIT"

#Convert Apache from mpm-prefork to mpm-worker
#Set params
#<IfModule mpm_*_module>
#  ServerLimit           (Total RAM - Memory used for Linux, DB, etc.) / process size
#   StartServers          (Number of Cores)
#   MinSpareThreads       25
#   MaxSpareThreads       75
#   ThreadLimit           64
#   ThreadsPerChild       25
#   MaxRequestWorkers     (Total RAM - Memory used for Linux, DB, etc.) / process  size
#   MaxConnectionsPerChild   1000
# </IfModule>
# /etc/httpd/conf.modules.d/00-mpm.conf

echo "
# LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
# LoadModule mpm_worker_module modules/mod_mpm_worker.so
LoadModule mpm_event_module modules/mod_mpm_event.so

<IfModule mpm_*_module>
  ServerLimit           $SERVER_LIMIT
  StartServers          $NUM_CORES
  MinSpareThreads       25
  MaxSpareThreads       75
  ThreadLimit           64
  ThreadsPerChild       25
  MaxRequestWorkers     $SERVER_LIMIT
  MaxConnectionsPerChild   1000
</IfModule>
" > /etc/httpd/conf.modules.d/00-mpm.conf

# Configure the workers
# pm = dynamic
# pm.max_children         (total RAM - (DB etc) / process size) = 850
# pm.start_servers        (cpu cores * 4)
# pm.min_spare_servers    (cpu cores * 2)
# pm.max_spare_servers    (cpu cores * 4)
# pm.max_requests         1000
MAX_CHILDREN=$(($MEMORY_AVAILABLE_MB / $PROCESS_SIZE_PHP_MB))
echo "Max Children: $MAX_CHILDREN"
NUM_START_SERVERS=$(($NUM_CORES * 4))
NUM_MIN_SPARE_SERVERS=$(($NUM_CORES * 2))
NUM_MAX_SPARE_SERVERS=$(($NUM_CORES * 4))

sed -c -i "s/^;*pm.max_children.*/pm.max_children = $MAX_CHILDREN/" /etc/php- fpm.d/www.conf
sed -c -i "s/^;*pm.start_servers.*/pm.start_servers = $NUM_START_SERVERS/" /etc/php- fpm.d/www.conf
sed -c -i "s/^;*pm.min_spare_servers.*/pm.min_spare_servers =  $NUM_MIN_SPARE_SERVERS/" /etc/php-fpm.d/www.conf
sed -c -i "s/^;*pm.max_spare_servers.*/pm.max_spare_servers =  $NUM_MAX_SPARE_SERVERS/" /etc/php-fpm.d/www.conf
sed -c -i "s/^;*pm.max_requests = 500.*/pm.max_requests = 1000/" /etc/php-> fpm.d/www.conf
Run Code Online (Sandbox Code Playgroud)