ab를 사용하여 Apache에서 성능 테스트를 수행하고 있습니다. 우리의 경우 Apache는 로드 밸런서 역할만 수행하여 두 Liferay 서버 간의 로드 균형을 조정합니다.
처음에는 1000개의 요청과 100개의 동시 요청으로 테스트했습니다. 테스트는 잘 진행되었습니다.
그런데 동시 사용자 500명, 요청 1000개로 테스트를 실행하면 테스트가 실패합니다.
$ ab -c 500 -n 1000 http://103.X.X.X/web/guest/statistics
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation,
Benchmarking (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
apr_socket_recv: Connection timed out (110)
Total of 386 requests completed
Kernel에서는 다음과 같은 정보를 볼 수 있습니다.
May 13 14:21:15 www kernel: possible SYN flooding on port 80. Sending cookies.
다음 두 매개변수의 값을 늘려 보았으나 테스트가 여전히 실패하고 시스템 로그 파일에 동일한 오류가 표시됩니다.
# echo "1024" > /proc/sys/net/core/somaxconn
# echo "2048" > /proc/sys/net/ipv4/tcp_max_syn_backlog
우리는 곧 캠페인을 시작할 예정이며 우리 서버에 많은 조회수를 받을 것으로 예상합니다. 테스트가 실패했기 때문에 우리 서버가 부하를 감당할 수 있을지 조금 걱정이 되었습니다. 이벤트 기간 동안 일일 동시 요청 수는 약 500~700건이 될 것으로 예상됩니다.
부하를 견딜 수 있도록 서버 성능을 향상시킬 수 있는 방법을 제안해 주십시오.
답변1
벤치마킹 목적으로 syn_cookies를 비활성화해야 합니다:
echo 0 > /proc/sys/net/ipv4/tcp_syncookies
하지만 작업이 완료되면 다시 활성화하세요!
서버가 로드를 처리할 수 없는 경우 웹 애플리케이션을 최적화하고, 구성을 조정하고, 일종의 캐싱을 사용하거나 로드 밸런서가 있는 프런트엔드 다중 서버를 사용해야 합니다. 이는 귀하의 애플리케이션과 예상 작업량에 따라 많이 달라지기 때문에 더 자세히 설명할 수 없습니다. 어쩌면 nginx나 varnish와 같은 프로젝트를 살펴봐야 할 수도 있습니다. 백엔드에 데이터베이스가 있나요? 어쩌면 이것도 병목 현상이 될 수 있습니다 ...