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)
我的目标是:即使我依赖这些方法,我也会看到一些指标,例如:
我已经测试: htop、glance、vmstat、sar 来检查 io、cpu、ram,但即使如此,我也不清楚: 我的配置是否适合具有此负载的这台机器,还是应该增加/减少某些内容? 然后我可以确定这些配置是好的并开始其他主题:CDN,缓存......
你如何处理这个?提前致谢,
正如您所指出的,这取决于您的脚本。我们根据正在汇总的服务器在部署脚本中动态调整这一点。
以下脚本基于在 Centos 和 AWS 基础设施上运行 Apache,但可以轻松适应您正在使用的内容。
基本上:
主要来源/基于:
脚步:
您需要知道您的计算机上可以运行多少个进程。因此计算你的主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。
但为了安全起见,请为所有其他进程保留 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 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)
Run Code Online (Sandbox Code Playgroud)#!/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