서버 성능 최적화 가이드

            "백 엔드 서비스 성능 최적화 가이드"

 

 

디렉토리

첫째, 서버 운영 체제 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 개 연결을. 높은 동시성에서 병목 현상이있을 것, 뜨거운 응용 프로그램을 사용하지 않는 것이 좋습니다.

 

추천

출처www.cnblogs.com/lyhero11/p/11302959.html