>  기사  >  백엔드 개발  >  Nginx PHP-FPM 최적화 기술 요약

Nginx PHP-FPM 최적화 기술 요약

WBOY
WBOY원래의
2016-07-29 09:16:141022검색

1. Unix 도메인 소켓 통신

이전에 Unix 도메인 소켓 통신 방법을 간략하게 소개한 적이 있습니다. Nginx+PHP-FPM의 도메인 소켓 구성 방법

Unix 도메인 소켓은 Nginx와 php-fpm 간 통신을 거치지 않기 때문에 실제로 통신 성능을 향상시킬 수 있습니다. 하지만

동시성이 높으면 불안정해집니다.

Nginx는 다음과 같은 오류를 자주 보고합니다.
connect() to unix:/dev/shm/php-fcgi .sock이 업스트림에 연결하는 동안 실패했습니다(11: 리소스를 일시적으로 사용할 수 없음)

다음 두 가지 방법으로 안정성을 향상할 수 있습니다.

1) nginx 및 php-fpm에서 백로그를 늘립니다.
구성 방법은 nginx 구성 파일에서 이 도메인 이름의 서버 아래에 Listen 80 이후 기본 backlog=1024를 추가하는 것입니다.

동시에 php-fpm.conf의 listening.backlog를 1024로 구성하고 기본값은 128입니다.

2) 양말 파일 수 및 php-fpm 인스턴스 수 늘리기
Nginx에서 새 양말 파일 만들기 업스트림 모듈을 사용하여 두 개의 양말 파일 뒤에 있는 두 개의 php-fpm 인스턴스 세트에 대한 요청을 로드 밸런싱합니다.
2.php-fpm 매개변수 조정
2.1 프로세스 수

php-fpm 초기/유휴/최대 작업자 프로세스 수

pm.max_children = 300
pm.start_servers = 20
pm.min_spare_servers = 5

pm.max_spare_servers = 35


2.2 최대 처리 요청 수

최대 처리 요청 수는 php 기준입니다. -fpm 작업자 여러 요청을 처리한 후 프로세스가 종료되고 마스터 프로세스

가 새 프로세스를 다시 생성합니다.

이 구성의 주요 목적은 PHP 인터프리터 또는 프로그램에서 참조하는 타사 라이브러리로 인해 발생하는

으로 인한 메모리 누수를 방지하는 것입니다. .

pm.max_requests = 10240


2.3 최대 실행 시간
최대 실행 시간은 php.ini와 php-fpm.conf에서 각각 설정 가능하며, 설정 항목은 각각 max_execution_time과 request_terminate_timeout입니다.
역할 및 영향은 다음을 참조하세요. Nginx의 502 및 504 오류에 대한 자세한 설명
3. php-fpm의 높은 CPU 사용량 문제 해결 방법
3.1CPU 사용량 모니터링 방법
1) top 명령
top 명령을 직접 실행한 후 1을 입력하면 각 코어의 CPU 사용량을 확인할 수 있습니다. 그리고 샘플링 시간은 top -d 0.1만큼 단축될 수 있습니다.
아래 sar는 최단 시간으로 1초밖에 안되는 것 같습니다.
2) sar 명령
sar 및 iostat 명령 설치:
sysstat.x86_64 : sar 및 iostat 시스템 모니터링 명령
yum install -y sysstat.x86_64
sar -P ALL 1 실행 100. -P ALL은 모든 코어를 모니터링한다는 의미이고, 1은 1초마다 수집을 의미하며, 100은 100회 수집을 의미합니다.
출력 결과는 다음과 같습니다.
CPU %user %nice %system %iowait %steal %idle
all 85.54 0.00 5.69 0.00 0.00 8.76
0 74.75 0.00 25.25 0.00 0.00 0.00
1 98.00 0.00 2.00 0.00 0.00 0.00
2 89.22 0.00 3.92 0.00 0.00 6.86
3 91.00 0.00 2.00 0.00 0.00 7.00
4 75.00 0.00 9.00 0.00 0.00 16.00
5 9 4.95 0.00 5.05 0.00 0.00 0.00
6 95.00 0.00 4.00 0.00 0.00 1.00
7 87.88 0.00 4.04 0.00 0.00 8.08
8 93.94 0.00 3.03 0.00 0.00 3.03
9 88. 00 0.00 3.00 0.00 0.00 9.00
10 89 .11 0.00 2.97 0.00 0.00 7.92
11 82.35 0.00 3.92 0.00 0.00 13.73
12 73.27 0.00 7.92 0.00 0.00 18.81
13 81.44 0.00 4.12 0.00 0.00 14.43
14 77.23 0.00 6.93 0.00 0.00 15.84
15 78.79 0.00 4.04 0.00 0.00 17.17
3.2 느린 로그 활성화
출력 php-fpm 느린 로그 구성, 임계값은 2초입니다.
request_slowlog_timeout = 2
slowlog = log/$pool.log.slow

sort/uniq 명령을 사용하여 다음을 수행합니다. php-fpm 느린 로그 분석 및 요약:
[root@b28-12 log]# grep -v "^$" www.log.slow.tmp | cut -d " " -f uniq | -c | sort -k1,1nr | head -n 50
5181 run() /www/test.net/framework/web/filters/CFilter.php:41
5156 filter() /www/test. net/framework/web/filters/CFilterChain .php:131
2670 = /www/test.net/index.php
2636 run() /www/test.net/application/controllers/survey/index.php php:665
2630 액션( ) /www/test.net/application/controllers/survey/index.php:18
2625 실행() /www/test.net/framework/web/actions/CAction. php:75
2605 runWithParams( ) /www/test.net/framework/web/CController.php:309
2604 runAction() /www/test.net/framework/web/filters/CFilterChain.php: 134
2538 run() / www/test.net/framework/web/CController.php:292
2484 runActionWithFilters() /www/test.net/framework/web/CController.php:266
2251 실행() /www/test.net/framework/web/CWebApplication.php:276
1799 번역() /www/test.net/application/libraries/Limesurvey_lang.php:118
1786 load_tables() /www/test.net/application/third_party/php-gettext/gettext.php:254
1447 runController() /www/test.net/framework/web/CWebApplication.php:135
매개변수 설명:
sort: 단어 정렬
uniq -c: 고유한 줄을 표시하고 이 줄이 파일의 각 줄 시작 부분에 나타나는 횟수를 추가합니다.
sort -k1,1nr: 다음에 따라 첫 번째 필드는 숫자에 따라 역순으로 정렬됩니다.
head -10: 데이터의 처음 10행 가져오기
3.3 strace를 사용하여 프로세스 추적
1) nohup을 사용하여 strace 변환 연결 시 php-fpm 프로세스가 종료될 때까지 백그라운드 실행:
nohup strace -T -p 13167 > 13167-strace.log &

매개변수 설명:

-c는 각 시스템 호출의 실행 시간, 횟수 및 오류 횟수를 계산합니다.
-d는 표준 오류에 대한 strace 디버깅 정보를 출력합니다.
-f
-o 파일 이름, 모든 프로세스의 추적 결과가 해당 파일 이름으로 출력됩니다.
-F는 vfork 호출을 추적하려고 시도합니다.
-h 간략한 도움말 정보를 출력합니다.
-i 시스템 호출의 진입 포인터를 출력합니다.
-q 분리에 관한 메시지 출력을 비활성화합니다.
-r ,,에 대한 상대 시간을 인쇄합니다. 각 시스템 호출
-t 출력의 각 줄 앞에 시간 정보를 추가합니다.
-ttt 마이크로초 수준 출력, 시간을 표현합니다.
-T는 각 호출에 소요된 시간을 표시합니다.
-v는 모든 시스템 호출을 출력합니다. 일부 호출은 빈번한 사용으로 인해 기본적으로 출력되지 않습니다.
-V strace 버전 정보를 출력합니다.
-x 비표준 문자열을 16진수 형식으로 출력
-xx 모든 문자열을 16진수 형식으로 출력합니다.
-
열은 출력 위치를 설정합니다. 반환 값은 40입니다.
-e execve execve와 같은 시스템 호출만 기록합니다.
-p 기본 프로세스 번호

2) 또한 -c 매개변수를 사용하여 strace 도움말을 요약할 수 있는데 이는 매우 편리하고 강력합니다!
[root@b28-12 log]# strace -cp 9907
프로세스 9907 연결 - 중단하여 종료
프로세스 9907 분리
% time     초  usecs/call     호출    오류 syscall
--- --- ----------- ----------- --------- --------- ------- ---------
56.61    0.016612           5      3121           읽기
11.11    0.003259           1      2517       715 >  8.04    0.002358           7       349           brk
  6.02    0.001767           1      1315           설문조사
  4.2 8    0.001255           6       228           recvfrom
  2.71    0.000796           1       671           open
  2.54    0.000745           0      2453           fcntl
  2.37    0.000696           1      1141           쓰기
  1.69    0.000497           1      593        13 접속
  1.37  0.000403           0      1816           lseek
  0.89    0.000262           1       451        22 sendto 0.56 0.000163 1 276208 LSTAT 0.26 0.0000770 174 MMAP
0.24 0.0069 2 41 SUCKET
0.23 0.000068 0 725 Close
0.00 0.000000 0 13 rt_sigaction 0.0000000 0 1 RT_SIGRETURN >0.000.00 0.000000 0 26 종료
0.00 0.000000 0 13 바인딩
0.0 0 0.000000 0 13 getsockname
0.00 0.000000 0 65 setockopt
0.00 0.00000 0 0 13 getockopt
0.00 0.000000 0 8 8 getdents
0.00 0.000000 0       26           chdir
0.00   0.000000           1           futex
------ ----------- ----------- ------- - - ------------
100.00 0.029344 18000 986 total
ps: strace를 사용하여 해석 및 실행을 배울 수 있습니다. PHP 인터프리터 프로세스
3.4 PHP 해석 및 실행 가속화
프로그램에 실제로 문제가 없다면 너무 많은 작업을 수행할 뿐 더 이상 최적화할 수 없습니다. 그런 다음 APC 또는 xcache와 같은 PHP 가속기를 사용하여 CPU가 PHP 파일을 해석하는 데 걸리는 시간을 줄이는 것이 좋습니다.
이러한 PHP 가속기는 PHP 파일이 처음 해석될 때 중간 코드 opcode를 생성하므로 후속 실행이 훨씬 빨라지고 일부 CPU 작업이 줄어듭니다. xcache를 예로 들어
설치 및 구성 방법을 살펴보겠습니다.
xcache를 설치하는 명령은 다음과 같습니다. ./configure에 매개변수가 많은데, 공식 홈페이지에는 설명이 없어서 --enable-만 켰습니다. xcache:
tar zxvf xcache-3.0.3.tar .gz
/usr/local/php/bin/phpize
./configure --with-php-c/local/php/bin/php -config --enable-xcache
make
make install
php.ini의 구성은 다음과 같습니다. 가장 중요한 것은 빨간색으로 표시된 두 매개변수입니다. 일반적으로 xcache.size를 결정하는 것이 좋습니다. PHP 파일 수에 따라 xcache.count는 CPU 코어 수와 동일합니다:


[xcache.admin]
xcache.admin.enable_auth = 꺼짐
xcache.admin.user = "xcache"
xcache.admin.pass = ""
[xcache]
xcache.shm_scheme ="mmap"
xcache.size=1024M
xcache.count =16
xcache.slots =8K
xcache.ttl=0
xcache.gc_interval = 0
xcache.var_size=16M
xcache.var_count =1
xcache.var_slots =8K
xcache.var_ttl=0
xcache.var_maxttl=0
xcache.var_gc_interval =300
xcache.test =끄기
xcache.readonly_protection = 끄기
;xcache.readonly_protection = 켜기
xcache.mmap_path ="/dev/zero"
🎜>xcache.optimizer =끄기
[xcache.coverager]
;;xcache.coverager =On
;;xcache.coveragedump_directory =""



일반적인 문제는 php-fpm을 시작할 때 오류가 보고됩니다:
xcache.mmap_path에 의해 설정된 파일을 열거나 생성할 수 없습니다. 경로 권한을 확인하거나 시스템 제한에 대해 xcache.size/var_size를 확인하세요이것은/tmp/xcache가 파일이며 디렉터리로 생성할 수 없습니다. php-fpm 서비스를 다시 시작한 후 top 명령을 사용하여 각 작업자 프로세스의 VIRT(스왑 영역 포함)가 xcache.size의 크기이지만 REQ가 매우 작아지는 것을 관찰합니다.
위 구성을 사용하면 CPU 사용량이 최고조에 달하는 시간이 단축되었지만, 여전히 최고조에 이르면 모든 코어가 90% 이상에 도달하게 됩니다. 어딘가에 잘못된 구성이 있는지는 모르겠습니다.
또한 동시성이 높을 때 /dev/zero 구성 방법으로 인해 Nginx 502 오류가 발생하는 경우가 많습니다. /tmp/xcache 및 readonly_protection 활성화는 매우 안정적입니다.

4.php 프로그램 성능 모니터링

일반적인 방법은 xdebug의 성능 모니터링 기능을 활성화하고 WinCacheGrind 소프트웨어를 통해 xdebug 출력 결과를 분석하는 것입니다.
xdebug 설치 및 IDE 디버깅 방법은 Vim+XDebug PHP 디버깅을 참조하세요
php.ini에 구성되는 항목 출력 성능 정보:
xdebug.auto_trace = 켜기
xdebug.auto_profile = 켜기
xdebug.collect_params = 켜기
xdebug.collect_return = 켜기
xdebug .profiler_enable = on
xdebug.trace_output_dir = "/tmp"
xdebug.profiler_output_dir ="/tmp"

이런 식으로 XDebug는 모든 실행 PHP 함수 성능 데이터를 출력하지만 생성된 파일은 더 커집니다. Collect_params, Collect_return,
과 같은 일부 옵션을 꺼서 출력 데이터의 양을 줄일 수 있습니다. 또는 자동 출력을 끄고 모니터링하려는 함수의 시작과 끝 부분에서 xdebug 함수를 호출하여 지정된 함수를 모니터링합니다.
출력 파일 이름은 Windows 플랫폼에서 WinCacheGrind를 사용하여 그래픽 분석을 위해 얻을 수 있는 캐시그라인드.out.1277560600 및 추적.3495983249.txt와 유사합니다.
WinCacheGrind 사용법은 인터넷에 많이 소개되어 있어서 여기서는 자세히 설명하지 않겠습니다. -c는 각 시스템 호출의 실행 시간, 횟수 및 오류를 계산합니다.
-d는 표준 오류에 대한 strace 디버깅 정보를 출력합니다.
-f는 포크 호출로 생성된 하위 프로세스를 추적합니다.
-o 파일 이름 , 모든 프로세스의 추적 결과가 해당 파일 이름으로 출력됩니다.
-F는 vfork 호출을 추적하려고 시도합니다. -f인 경우,
-h는 간단한 도움말 정보를 출력합니다.
-i 인쇄 시스템 호출의 진입 포인터
-q 분리에 대한 메시지 출력을 비활성화합니다.
-r 출력의 각 줄에 대해 각 시스템 호출의 상대 시간을 인쇄합니다. 출력의 각 라인
-tt 출력의 각 라인 앞에 시간 정보를 추가합니다(마이크로초 수준).
-ttt 시간을 초 단위로 표시하는 마이크로초 수준 출력
-T 각 라인에 걸리는 시간입니다.
-v는 모든 시스템 호출을 출력합니다. 환경 변수, 상태, 입력 및 출력 등에 관한 일부 호출은 빈번한 사용으로 인해 기본적으로 출력되지 않습니다.
-x 비표준 문자열을 16진수 형식으로 출력
-xx 모든 문자열을 16진수 형식으로 출력합니다.
-a 열
반환 값의 출력 위치를 설정합니다.
-e execve execve


와 같은 시스템 호출만 기록합니다.-p 주 프로세스 번호

저작권 표시: 이 이 기사는 해당 블로거의 원본 기사이므로 블로거의 허가 없이 복제할 수 없습니다.

이상 내용의 측면을 포함하여 Nginx PHP-FPM 최적화 기술을 요약해서 소개했습니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.