Linux Nginx 성능 최적화 - 성능 최적화 분석, 성능 최적화, CPU 친화 설정, 유 니 버 설 설정, 인터페이스 압력 측정
1. 현재 시스템 구조의 병목
먼저 알 아야 할 것 은 현재 시스템 의 병목 이다. 어떤 응용 을 사용 하 는 지, 어떤 업 무 를 뛰 는 지, 서비스 가 무엇 인지, 모든 서비스 가 얼마나 많은 병행 을 지원 하 는 지 알 아야 한다.예 를 들 어 Nginx 에 대해 말하자면 우리 가 정적 자원 을 처리 하 는 효율 이 가장 높 은 병목 은 얼마나 큽 니까?
현재 cpu 부하, 메모리 사용률, 프로 세 스 사용률 을 보고 간단하게 판단 할 수 있 습 니 다.또한 운영 체제 의 일부 도 구 를 통 해 현재 시스템 의 성능 병목 을 판단 할 수 있다. 예 를 들 어 대응 하 는 로 그 를 분석 하고 요청 수량 을 볼 수 있다.nginx httpstub_status_module 모듈 은 대응 하 는 연결 수, 총 악수 횟수, 총 요청 수 를 봅 니 다.또한 온라인 에서 압력 테스트 를 실시 하여 현재 시스템 의 성능, 병발 수 를 파악 하고 성능 평 가 를 잘 할 수 있다.
2. 업무 모델 파악
성능 최 적 화 를 할 때 업 무 를 익 혀 야 한다. 우 리 는 모든 인터페이스 업무 유형 이 어떤 업무 인지 알 아야 한다. 예 를 들 어 전자상거래 가 앞 다 투어 구 매 하면 전자상거래 의 평소에 유량 이 매우 적 지만 앞 다 투어 구 매 하 는 초 살 활동 에 이 르 러 유량 이 폭발 적 으로 증가 할 것 이다.마찬가지 로 시스템 의 등급 구 조 를 파악 해 야 한다. 각 층 이 중간 층 에서 하 는 것 이 대리 인지 동정 분리 인지 백 스테이지 에서 직접 서 비 스 를 하 는 지 알 아야 한다.우 리 는 업무 접속 층 과 시스템 차원 에 대해 정리 해 야 한다.
3. 성능 과 안전
성능 과 안전 도 고려 해 야 할 요소 이다. 예 를 들 어 방화벽 을 설계 할 때 규칙 이 너무 전면적 이면 성능 에 영향 을 주 고 성능 에 대해 지나치게 중시 하면 안전 에 큰 위험 을 남 길 수 있다.따라서 이들 의 관 계 를 잘 평가 하고 이들 의 경중 과 전체적인 상관 성 을 파악 하 며 대응 하 는 점 을 잘 평가 해 야 한다.
4. 시스템 과 Nginx 성능 최적화
시스템 병목 과 현황 을 분석 한 후에 영향 성능 에 따라 전체적인 평가 와 최 적 화 를 할 수 있다.
네트워크 (네트워크 트 래 픽, 패 킷 을 잃 어 버 렸 는 지, 네트워크 의 안정성 은 사용자 의 요구 에 영향 을 줄 수 있 습 니 다) 시스템 (시스템 부하, 포화, 메모리 사용률, 시스템 안정성, 하드웨어 디스크 에 손상 이 있 는 지) · 서비스 (연결 최적화, 커 널 성능 최적화, http 서비스 요구 우수 화 는 모두 nginx 에서 업무 에 따라 설정 할 수 있 습 니 다) · 프로그램(인터페이스 성능, 처리 요청 속도, 모든 프로그램의 실행 효율) 데이터 베이스, 바 텀 서 비 스 · 위 에 열거 한 모든 등급 이 관련 되 고 전체적인 성능 에 도 영향 을 줄 수 있 으 며 여기 서 주목 하 는 것 은 Nginx 서비스 라 는 층 이다.
시스템 기본 값 은 파일 핸들 에 제한 이 있 습 니 다. 프로 세 스 가 제한 없 이 핸들 을 호출 하지 않 습 니 다. 시스템 자원 이 제한 되 어 있 기 때문에 모든 서비스 가 얼마나 큰 파일 핸들 을 사용 할 수 있 는 지 제한 해 야 합 니 다. 운영 체제 에서 기본적으로 사용 하 는 파일 핸들 은 1024 개의 핸들 입 니 다.
[root@nginx-server ~]# vim /etc/security/limits.conf
#* soft core 0
#* hard rss 10000
#@student hard nproc 20
#@faculty soft nproc 20
#@faculty hard nproc 50
#ftp hard nproc 0
#@student - maxlogins 4
#root root ,soft , , ok
root soft nofile 65535
root hard nofile 65535
# *
* soft nofile 25535
* hard nofile 25535
루트 와 * 를 볼 수 있 습 니 다. 루트 대 표 는 루트 사용자 입 니 다. * 모든 사용 자 를 대표 합 니 다. 뒤의 숫자 는 파일 핸들 크기 입 니 다. 구체 적 으로 개인 업무 에 따라 설정 할 수 있 습 니 다.
[root@nginx-server ~]# vim /etc/nginx/nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
worker_rlimit_nofile 65535; #
events {
worker_connections 1024; #
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$http_user_agent' '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'"$args" "$request_uri"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
worker rlimit nofile 은 프로 세 스 에서 제 한 됩 니 다.
5. CPU 친화 설정
cpu 의 친화 성 은 nginx 가 서로 다른 work 작업 프로 세 스 를 서로 다른 cpu 에 연결 시 켜 work 간 에 cpu 를 계속 전환 하 는 것 을 줄 일 수 있 고 프로 세 스 가 CPU 에서 이동 하 는 빈도 가 작 아 져 성능 손실 을 줄 일 수 있 습 니 다.
cpu 핵심 수 보기
[root@nginx-server ~]# cat /proc/cpuinfo|grep "cpu cores"|uniq
cpu 사용량 보기
[root@nginx-server ~]#top # 1
worker processes 설정
[root@nginx-server ~]# vim /etc/nginx/nginx.conf
# cpu * cpu worker_processes
worker_processes 2; # cpu / auto
cpu
# 2cpu, cpu 8 , :
worker_processes 16;
worker_cpu_affinity 1010101010101010 0101010101010101;
# nginx 1.9 , cpu;
worker_cpu_affinity auto;
6. nginx 유 니 버 설 설정 최적화
# nginx ,
user nginx;
# worker ,
worker_processes 2;
# ,
worker_cpu_affinity auto;
# warn
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
# nginx
worker_rlimit_nofile 35535;
#
events {
# epoll
use epoll;
# , worker_processes * 1024
worker_connections 10240;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
charset utf-8; #
# ,
log_format main '$http_user_agent' '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'"$args" "$request_uri"';
access_log /var/log/nginx/access.log main;
sendfile on; #
#tcp_nopush on; #
keepalive_timeout 65;
########
#Gzip module
gzip on; #
include /etc/nginx/conf.d/*.conf;
}
7. ab 인터페이스 압력 테스트 도구
ab 는 Apache 하이퍼텍스트 전송 프로 토 콜 (HTTP) 의 성능 테스트 도구 입 니 다. 현재 설 치 된 Apache 의 실행 성능 을 테스트 하 는 것 이 목적 입 니 다. 주로 Apache 가 초당 몇 개의 요청 을 처리 할 수 있 는 지 보 여 줍 니 다.
[root@nginx-server ~]# yum install httpd-tools -y
[root@nginx-server ~]# ab -n 2000 -c 2 http://127.0.0.1/
-n
-c
-n: requests,
-c: concurrency,
-t: timelimit, ( : )
-b: windowsize,TCP / ( : )
-p: postfile, POST , -T
-u: putfile, PUT , -T
-T: content-type, Content-Type , :application/x-www-form-urlencoded, text/plain
-v: verbosity,
-w: HTML
-i: HEAD GET
-x: table
-y: tr
-z: td
-C: cookie , :"Apache=1234"( )
-H: , :"Accept-Encoding: gzip", ( )
-A: ,
-P: ,
-X: , :"126.10.10.3:88"
-V:
-k: HTTP KeepAlive
-d:
-S:
-g: gnuplot
-e: CSV
-r:
-H: , ab -help
Server Software: nginx/1.10.2 ( )
Server Hostname: 192.168.1.106( )
Server Port: 80 ( )
Document Path: /index1.html. ( URL )
Document Length: 3721 bytes ( URL )
Concurrency Level: 1000 ( )
Time taken for tests: 2.327 seconds ( )
Complete requests: 5000 ( )
Failed requests: 688 ( )
Write errors: 0 ( )
Total transferred: 17402975 bytes ( )
HTML transferred: 16275725 bytes (HTML )
Requests per second: 2148.98 [#/sec] (mean) ( ) ,
Time per request: 465.338 [ms] (mean) ( ( 1000) )
Time request: 0.247 [ms] (mean, across all concurrent requests) ( )
Transfer rate: 7304.41 [Kbytes/sec] received ( , :KB/s)
...
Percentage of the requests served within a certain time (ms)
50% 347 ## 50% 347ms
66% 401 ## 60% 401ms
75% 431
80% 516
90% 600
95% 846
98% 1571
99% 1593
100% 1619 (longest request)
[root@nginx-server ~]# ab -n 50 -c 2 http://www.testpm.cn/
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking www.testpm.cn (be patient).....done
Server Software: nginx/1.16.0
Server Hostname: www.testpm.cn
Server Port: 80
Document Path: /
Document Length: 612 bytes
Concurrency Level: 2
Time taken for tests: 2.724 seconds
Complete requests: 50
Failed requests: 0
Write errors: 0
Total transferred: 42250 bytes
HTML transferred: 30600 bytes
Requests per second: 18.35 [#/sec] (mean)
Time per request: 108.968 [ms] (mean)
Time per request: 54.484 [ms] (mean, across all concurrent requests)
Transfer rate: 15.15 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 42 52 17.3 46 137
Processing: 43 54 20.8 47 170
Waiting: 42 53 20.7 47 170
Total: 84 106 28.9 93 219
Percentage of the requests served within a certain time (ms)
50% 93
66% 96
75% 101
80% 130
90% 153
95% 161
98% 219
99% 219
100% 219 (longest request)
END