"백 엔드 서비스 성능 최적화 가이드"
디렉토리
첫째, 서버 운영 체제 2
둘째, 웹 서버 / 역방향 프록시 서버 ( Nginx와 ) 2
셋째, 응용 프로그램 서버 ( 톰캣 ) 2
넷째, 응용 프로그램 로그 구성 2
다섯째, 데이터베이스 ( MySQL의 ) 3
여섯째, 데이터베이스 연결 풀 3
세븐, RESTfull의 서비스 호출 (4)
첫째, 서버 운영 체제
1, 모든 프로세스는 글로벌 제한을 공유
보기 시스템의 최대 수를 처리하는 고양이 / proc 디렉토리 /에서 sys /의 FS / 파일 NR의
검토 : /etc/sysctl.conf에
fs.file-최대 = 100000
net.ipv4.ip_conntrack_max = 100000
net.ipv4.netfilter.ip_conntrack_max = 100000
2, 가장 큰 단일 프로세스 핸들
에 서버 구성 기본값 1024
프로세스의 최대 수 확인 에 ulimit -u
프로세스 핸들의 최대 수를 볼을 -n ULIMIT
수정 : 는 /etc/security/limits.conf를
* 소프트 NOFILE = 32768
* 하드 NOFILE = 65536
모든 사용자에 대한 최대 열린 핸들 단일 스레드, 소프트 한계 32768 , 하드 제한 65536 ;
3, TCP 연결의 생존 시간은 대기 연결 닫혀
수정 /etc/sysctl.conf에를 다음 줄을 추가합니다 :
#의 의 기본 시간 초과의 기간
net.ipv4.tcp_fin_timeout = 30
# 카이 재사용이 가능 TIME_WAIT 소켓 새로운 재사용 TCP의 기본적으로 연결 0 꺼냅니다
net.ipv4.tcp_tw_reuse = 1
# 열기 TCP 연결 TIME_WAIT 소켓 신속 기본적으로 복구 0 꺼냅니다
net.ipv4.tcp_tw_recycle = 1
4, 은 Using 끝나면 uname -a 시스템의 커널 버전을 보려면 명령의 있는지 확인 리눅스 커널 버전보다 높은 2.6.28는 , 이 버전의 리눅스 지원 효율적인 비동기 입출력 모델 의 epoll은 , JDK를 NIO의 개발 키트는 한 쌍을 포함하는 경우 운영 체제 버전 번호 앞에 분석은 ( 리눅스> 2.6이 될 때 호출 epoll에 기본 방법), 자바, NiO를가 한다 IO 모델의 방법은 운영 체제에 의해 결정됩니다에 의해 달성했다.
둘째, 웹 서버 / 역방향 프록시 서버 ( nginx를 )
nginx.conf 프로필 :
5, nginx를 하나의 작업자 프로세스는 외부 연결의 최대 개수를 설정합니다
worker_connections 16000
6 Nginx에 핸들을 열 수있는 프로세스의 최대 수
worker_rlimit_nofile 65535
7의 nginx의 작업자 프로세스
8 worker_processes 일반적 설정 CPU는 핵의 수를 두배 ]
셋째, 응용 프로그램 서버 ( 톰캣 )
1 만들 커넥터 로 구성된다 NIO의 모드, 연결의 적절한 최대 값을 설정 ( springboot 매립 톰캣 디폴트는 NIO 최대 연결 개수 MAX-연결 기본 10000 )
2 조정 톰캣 작업자 스레드 큐 큐 길이 개수
server.tomcat.max - 스레드 = 800
server.tomcat.accept 카운트 = 200
넷째, 응용 프로그램 로그 구성
1, 응용 프로그램이 가장 좋은 현재의 연습 기록 sl4j +를 logback을 , 코드가 사용되어야한다 sl4j 외관을 기록, 직접 사용 금지 log4j에 구체적인 실현을.
2, 약간 높은 동시 서비스를 줄이기 위해 최적화 된 로그 비동기 일을 고려해야합니다 IO를 개선하기 위해 시간을 차단 CPU의 활용도를 :
<펜더 이름 = "시스템 로그"
클래스 = "ch.qos.logback.core.rolling.RollingFileAppender">
......
</ 펜더>
<펜더 이름 = "ASYNC_ROLLING_FILE"클래스 = "ch.qos.logback.classic.AsyncAppender">
<QUEUESIZE> 256 </ QUEUESIZE>
<includeCallerData> 진정한 </ includeCallerData>
<펜더-REF REF = "시스템 로그"/>
</ 펜더>
<루트 레벨 = "INFO">
<! - <펜더-REF REF = "STDOUT"/> ->
<펜더-REF REF = "ASYNC_ROLLING_FILE"/>
</ 루트>
Logback 제공 AsyncAppender 내장 비동기 로그 출력 큐 기본하여 (256) , 성능을 보장하기 위해 길이에 걸쳐 80 %의 적하 개시 에러 외부 로그.
속성 이름 |
유형 |
기본값 |
기술 |
QUEUESIZE |
INT |
256 |
내장 BlockingQueue의 최대 용량 |
discardingThreshold |
INT |
-1 |
임계 값의 BlockingQueue (80 %)보다 높은 용량, 에러 로깅 수준을 폐기 할 때 기본적으로, 당신이 (둘 때마다 총량을 저장) 로그를 버리고 싶지 않아요, 그것은 0으로 설정하지만, 큐가 가득 차면 할 수있다 폐기 모든 로그 정보를 대기열에 때, 1 (기본값)로 설정하는 것이 좋습니다. 로그가 정상으로 폐기 될 수있다, 그것은 성능을 크게 개선하고 중요한 오류 로그를 저장할 수 있습니다.
|
includeCallerData |
부울 |
그릇된 |
발신자 데이터를 추출하는 비용은 매우 비싸다. 이벤트가 대기열에 추가 될 때 기본적으로 성능을 향상시키기 위해, 발신자와 관련된 이벤트 데이터가 추출되지 않습니다. 같은 스레드 이름으로 기본적으로, 단지 "싸구려"데이터. 로그 예 행 번호를 true로 설정 값을 출력해야할지 옵션. includeCallerData = TRUE를 측정하는 것은 약간의 성능 저하를 가지고 있지만, 높은에 아직까지 TPS 높은 동시 동기화 로그 방식합니다. |
다섯째, 데이터베이스 ( MySQL의 )
스트레스 테스트를하고, 나는 데이터베이스 연결의 수에 제한뿐만 아니라 일부 긴 슬로우 쿼리,이 지역의 주요 문제를 해결하기 위해 다음과 같은 구성을 발견
다음 매개 변수는 다시 시작한 후 효과로, 데이터베이스를 데이터베이스를 /etc/my.cnf에 수정 될 수 있습니다.
(1) 연결의 최대 숫자 다음과 같이 제공된 데이터베이스에 접속하는 사용자의 최대 수,
= 1000 MAX_CONNECTIONS (기본 151)
MAX_USER_CONNECTIONS = 1000
2 , 임시 테이블 크기 중에 생성 된 쿼리 수 를 사용 할 때 쿼리에 가입 max_heap_table_size, tmp_table_size 변수 설정. 매개 변수 max_heap_table_size 보다 tmp_table_size 변수 시간, 시스템이됩니다 max_heap_table_size 최대 메모리 임시 테이블로 상한 값이보다 큰, 재기록 하드 디스크 , 증가 힙 테이블의 크기는 동등한 효과는 쿼리 속도를 가입 할 수 있습니다 .
예를 들면 :
200M = tmp_table_size 변수 (기본 16M)
max_heap_table_size = 500M (默认 16M)
. (3)는 , read_buffer_size로서 :이다 MySQL이 버퍼 크기에 판독 , 버퍼로 읽어 순차 스캔을 할당 테이블에 대한 요청, MySQL은 그 일부 메모리 버퍼를 할당한다. read_buffer_size 변수는 버퍼의 크기를 제어한다. 테이블의 순차 주사에 대한 요구가 매우 빈번하고있는 경우 등 이 빈번하게 주사 너무 느린 성능은 변수의 값, 및 메모리 버퍼의 크기를 증가시킴으로써 개선 될 수있다.
다음과 같은 설정 :
sort_buffer_size = 8M
read_buffer_size = 8M
read_rnd_buffer_size = 8M
join_buffer_size , 즉 함께 테이블 가입 협회 : 예컨대, join_buffer_size = 8M이다 .
여섯째, 데이터베이스 연결 풀
에서는 톰캣-JDBC 연결 풀, 예를 들면, 다른 연결 풀 DBCP , C3P0 , 사제 등;
1, 핵심 포털 사용자 ID의 데이터베이스 연결 풀 매개 변수는 여러 응용 프로그램을 수정 : 사용자가 최대 연결 maxActive에 대한 유휴 최대 maxIdle (300) , 최소 유휴 minIdle , 초기 수 initialSize가 60 , 포털 \ 코어 \ 정체성 : 최대 연결, 최대 유휴 (100) , 최소 유휴 초기 번호 20 ; 초기 다른 응용 5 최대 20
2, 프로덕션 환경에서 해제 testOnBorrow 및 testOnReturn ( 설정 false로) 주로 연결 실패를 통해, testWhileIdle 보장 .
세븐, Restfull 서비스 호출
1, 핫스팟 서비스를 직접 사용하는 것을 허용하지 않습니다 JDK 자신의 java.net.URLConnection의가 될 HTTP 클라이언트 호출
2, 사용하는 것이 좋습니다 아파치 HttpClient를 , okhttp 연결 풀링 모드 등을 HTTP의 라이브러리 나머지 연결을 설정, 서비스 호출 오버 헤드가 반복적으로 줄일 수 있습니다. 기반 스프링 기술 스택 응용 프로그램에 더 나은 방법은 사용하는 것입니다 restTemplate을 상기 구현을 구성 할 수 있습니다.
3, 아파치 HttpClient를를 유창함 API는 자신을 바탕으로 기본 HttpClient를의 코드를 작성 죽은 것을 특징으로 연결 풀 모드, maxTotal 및 maxPerRoute 모든 요청이 공통 연결 풀의 총 사용 200 개 연결, 각 목적지 까지 100 개 연결을. 높은 동시성에서 병목 현상이있을 것, 뜨거운 응용 프로그램을 사용하지 않는 것이 좋습니다.