>  기사  >  类库下载  >  PHP + nginx 웹사이트 동시성 스트레스 테스트 및 최적화

PHP + nginx 웹사이트 동시성 스트레스 테스트 및 최적화

高洛峰
高洛峰원래의
2016-10-20 13:41:543262검색

1. 테스트 도구:

Apache 스트레스 테스트 도구 ab

ab는 ab 도구만 설치할 수 있는 성능 테스트 도구입니다.

Ubuntu 설치 ab

apt-get install apache2-utils

centos 설치 ab

yum install httpd-tools

ab 매개변수에 대한 자세한 설명

형식: ./ab [옵션] [ http://]호스트 이름[:port]/path

매개변수:

-n테스트 세션에서 실행된 요청 수입니다. 기본적으로 하나의 요청만 수행됩니다.

-c 한 번에 생성된 요청 수입니다. 기본값은 한 번에 하나씩입니다.

-t테스트가 실행되는 최대 시간(초)입니다. 내부 암시적 값은 -n 50000이며, 이는 서버 테스트를 고정된 총 시간으로 제한합니다. 기본적으로 시간 제한은 없습니다.

-p에는 게시해야 하는 데이터가 포함된 파일이 포함되어 있습니다.

-P는 대중교통 기관사에게 BASIC 인증 신뢰를 제공합니다. 사용자 이름과 비밀번호는 :로 구분되며 base64 인코딩으로 전송됩니다. 이 문자열은 서버에서 요구하는지 여부(즉, 401 인증 요구 사항 코드가 전송되었는지 여부)와 관계없이 전송됩니다.

-T POST 데이터에서 사용하는 콘텐츠 유형 헤더 정보입니다.

-v는 표시되는 정보의 자세한 정도를 설정합니다. 값이 4 이상이면 헤더 정보가 표시되고, 값이 3 이상이면 응답 코드(404, 200 등)가 표시되고, 값이 2 이상이면 응답 코드(404, 200 등)가 표시됩니다. 더 크면 경고 및 기타 정보가 표시될 수 있습니다.

-V 버전 번호를 표시하고 종료합니다.

-w는 결과를 HTML 테이블 형식으로 출력합니다. 기본적으로 흰색 배경에 2열 너비의 테이블입니다.

-GET 대신 HEAD 요청을 수행합니다.

-x는

속성의 문자열을 설정합니다.

-X는 요청에 프록시 서버를 사용합니다.

-y는

속성의 문자열을 설정합니다.

-z는

속성의 문자열을 설정합니다.

-C 요청 라인에 쿠키를 첨부합니다. 일반적인 형태는 이름=값의 매개변수 쌍이며 이 매개변수는 반복될 수 있습니다.

-H는 요청에 추가 헤더 정보를 추가합니다. 이 매개변수의 일반적인 형식은 콜론으로 구분된 필드와 값 쌍(예: "Accept-Encoding:zip/zop;8bit")을 포함하는 유효한 헤더 라인입니다.

-A는 서버에 BASIC 인증 신뢰를 제공합니다. 사용자 이름과 비밀번호는 :로 구분되며 base64 인코딩으로 전송됩니다. 이 문자열은 서버에서 요구하는지 여부(즉, 401 인증 요구 사항 코드가 전송되었는지 여부)와 관계없이 전송됩니다.

-h는 사용법을 보여줍니다.

-d "XX [ms] 테이블 내에 게재된 비율" 메시지를 표시하지 않습니다(이전 버전에 대한 지원 제공).

-e는 해당 요청 비율(1%~100%)을 처리하는 데 필요한 시간 비율(마이크로초)을 포함하는 쉼표로 구분된(CSV) 파일을 생성합니다. 이 형식은 "이진화"되었기 때문에 'gnuplot' 형식보다 더 유용합니다.

-g 모든 테스트 결과를 'gnuplot' 또는 TSV(탭으로 구분) 파일에 씁니다. 이 파일은 Gnuplot, IDL, Mathematica, Igor 및 Excel로 쉽게 가져올 수 있습니다. 첫 번째 줄은 제목입니다.

-GET 대신 HEAD 요청을 수행합니다.

-k는 하나의 HTTP 세션에서 여러 요청을 수행하는 HTTP KeepAlive 기능을 활성화합니다. 기본적으로 KeepAlive 기능은 활성화되어 있지 않습니다.

-q 처리된 요청 수가 150개보다 큰 경우 ab는 약 10% 또는 100개의 요청을 처리할 때마다 stderr에 진행률 카운트를 출력합니다. -q 플래그는 이러한 메시지를 억제합니다.

예:

### POST /user/login

ab -n 100 -kc 10 -p user_login -T 'application/json' -H 'Accept-Encoding:gzip, deflate' -H 'accept-language:zh-Hans-CN;q=1, en-CN;q=0.9'  http://XXX/user/login


##### request data
文件 user_login 内容:
{"email":"ws65536@qq.com","password":"ws65536"}
### GET /default/index

ab -n 1000 -c 100 http://XXX/default/index

테스트하는 동안 테스트 중인 서버에서 htop 명령을 사용하여 실시간 CPU 및 메모리 사용량을 볼 수 있습니다.

PHP + nginx 웹사이트 동시성 스트레스 테스트 및 최적화

ab에 대한 자세한 내용은 ab

구성 최적화

사용에 대한 자세한 설명을 참조하세요.

nginx에는 PHP 요청을 처리하는 세 단계가 있습니다.

1단계: 요청을 수락하고 PHP 요청인지 확인한 후 2단계로 이동합니다.

2단계: 소켓을 통해 PHP-FPM의 fast-cgi에 연결하고 PHP-FPM이 요청을 처리하도록 합니다.

3단계: PHP-FPM 처리 결과를 얻고 http 헤더를 추가한 후 클라이언트에 반환합니다.

따라서 nginx의 PHP 동시성 성능을 향상하려면 다음 세 단계를 수행해야 합니다.

1. nginx의 동시 연결 수를 늘립니다(nginx.conf에서 작업자_연결 및 작업자_프로세스 조정).

worker_connections: 각 작업자 프로세스가 동시에 처리(시작)할 수 있는 최대 연결 수(모든 연결 수 포함)

worker_processes: nginx가 열 프로세스 수를 지정합니다. 공식 성명에 따르면 일반적으로 하나를 여는 것으로 충분하며, 여러 개를 더 열면 머신 IO의 영향을 줄일 수 있습니다. 일반적으로 현재 시스템의 총 CPU 코어 수의 1~2배입니다.

참조:

nginx 동시성 문제에 대한 생각: 작업자_연결, 작업자_프로세스 및 최대 클라이언트

Nginx 작동 원리, 최적화 및 허점

2.调大php-fpm的并发连接数(调php-fpm.conf 的pm.max_children等)。

本人用的是Ubuntu 14.04.4,PHP 5.5.9,以下目录结构对其他服务器环境可能不适用。

由于在 /etc/php5/fpm/php-fpm.conf 中并没有找到 max_children ,于是使用以下命令进行查找:

# 在/etc/php5/fpm 目录下查找所有文件,并依次在每个文件中查找"max_children"
sudo find /etc/php5/fpm -name * | xargs grep "max_children"

终于在 /etc/php5/fpm/pool.d/www.conf 中找到了 max_children 等相关配置。

关于具体配置,请参考以下内容:

(PHP手册)FastCGI 进程管理器(FPM)

php-fpm的配置和优化

PHP-FPM性能优化参考

PHP FPM php-fpm.conf设置详解

3.增加系统的最大文件数量限制(ulimit -n 65535)。

由于NGINX处理PHP请求的第二步需要通过socket的方式和PHP-FPM通信,它能新建的最大socket数受到系统最大打开文件数的限制。新装的Linux默认只有1024,所以必须增加系统最大打开文件数目。

ulimit -n 命令可以查看当前系统最大打开文件数。

ulimit -n 65535 可以将系统最大打开文件数临时修改为65535,然而退出登录后就会失效。

想要修改系统最大打开文件数,并永久生效:

vi /etc/security/limits.conf
        
# 添加如下的行
* soft noproc 11000
* hard noproc 11000
* soft nofile 65535
* hard nofile 65535

说明:

* 代表针对所有用户

noproc 是代表最大进程数

nofile 是代表最大文件打开数

具体配置参考一下内容:

ulimit -n 修改

linux有效修改max open files/ulimit -n


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

관련 기사

더보기