피크타임인 밤 12시만 되면 서버가 502에러가 뜨면서 죽어버립니다.
2017/12/05 00:00:10 [error] 1408#1408: *3146517 connect() to unix:/run/php/php7.0-fpm.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: 162.158.XXX.XXX, server: www.example.com, request: "GET /bbs/board.php?bo_table=example1&wr_id=1159&page=17 HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.0-fpm.sock:", host: "www.example.com", referrer: "https://www.example.com/bbs/board.php?bo_table=example1&page=16&page=17"
NginX 에러 로그는 위와 같습니다,[이후 모든 에러로그 동일]
php-fpm 로그는 서버 에러 난 시각부터 기록되지도 않았습니다.[아마 php-fpm이 다운되서 그런걸로 추정]
MySQL 로그는 아예 로그 기록 설정을 안해놔서 로그가 기록되지 않았습니다.
대체 뭐가 문제인지 모르겠습니다 ㅠ.ㅠ
댓글 16
출석부가 문제 아닐까요? XE타운도 12시만 되면 출석부 때문에 사이트가 매우 느려집니다.
www.conf
[www]
user = www-data
group = www-data
listen = /run/php/example1.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 350
pm.start_servers = 18
pm.min_spare_servers = 13
pm.max_spare_servers = 100
pm.max_children = 350 ㄷㄷㄷ
혹시 CPU가 한 50코어쯤 되고 RAM도 한 50GB쯤 되시나요? 그렇지 않다면 확 줄이세요.
CPU 코어수의 6~8배, RAM 용량(GB)의 8배 (DB도 돌린다면 4~6배) 중 적은 쪽이 적정값입니다.
대부분의 서버에서는 이 설정값이 두 자리 숫자를 넘어가면 안됩니다.
이 설정값이 너무 높으면 php-fpm 혼자 서버 자원을 다 쓰고 뻗어버립니다.
서버 운영에서 제일 중요한 것이 DB 튜닝이고
두 번째가 아파치 MaxRequestWorkers 또는 php-fpm 프로세스 숫자 튜닝입니다.
참고로 피크시간대 동접수가 1만 명에 육박하는 대규모 사이트도
pm.max_children = 100 내외로 운영하고 있습니다.
물론 위의 내용은 제일 먼저 눈에 띈 문제일 뿐, 그게 원인은 아닐 수도 있습니다.
에러 로그와 슬로우 로그가 있어야 추측이라도 해보지요.
sysctl.conf에서 net.core.somaxconn 값이 너무 낮아서 소켓 연결이 안 되고 있을 가능성도 있고,
너무 느린 쿼리나 DB단의 lock 때문에 350개의 프로세스 모두 먹통이 되어 있을 수도 있습니다.
평균동접은 600명정도이고 피크타임때 동접이 1200입니다.
참고로 php-fpm 로그는 다운되기 시작할때부터 기록되지 않았어요
몇 초 이상 걸리는 쿼리나 요청은 모두 로그에 기록해서
어느 모듈, 애드온이 문제인지 찾는 거예요.
pm.max_children 비율을 100이하로 낮추니 502 오류가 뜹니다.
그래서 지금은 110으로 설정 해놨습니다.
pm.start_servers = 18
pm.min_spare_servers = 13
pm.max_spare_servers = 100
위 세가지 값도 바꿔줘야 하나요?
pm.start_servers = pm.max_children의 절반 정도
pm.min_spare_servers = pm.start_servers와 같은 값
pm.max_spare_servers = pm.max_children과 같은 값
이렇게 생각하시면 편합니다.
이 세 가지 설정은 완전 엉뚱한 값으로 해놓지만 않으면
성능이나 안정성에 큰 영향을 미치지 않습니다.
알려주시면 감사하겠습니다.
그냥 많이 해봐야죠...... 인터넷상에 제대로 된 매뉴얼도 찾기 힘들고요.
그누보드라면 XE 출석부와는 무관하겠지만, 빌더에서 제공하는 간단한 기능이나 SIR 홈페이지에 돌아다니는 코드들 중에도 성능이 아주 안 좋은 것들이 많습니다. XE 애드온도 마찬가지예요. 이런 거 만들어서 뿌리는 분들 중 상당수가 동접수가 1에 수렴하는ㅡ.ㅡ 개인 홈페이지에서 테스트해보고 겨우 에러만 안 나는 상태로 내놓기 때문에 실제로 사용자가 많은 사이트에 가져가면 뒤집어지기 십상이지요. 메뉴에 새 글 표시를 하거나 글 제목 옆에 모바일 작성 아이콘을 넣거나 회원 닉네임 옆에 레벨을 표시하는 등 지극히 평범한 기능들도 어떻게 구현하는지에 따라 100배 이상 성능 차이가 발생할 수 있습니다.
어디가 느린지 찾아내서 고치려면 본격 탐정놀이를 해봐야 합니다. 일단 위에서 말씀드린 php-fpm 슬로우 로그와 MySQL 슬로우 로그부터 켜세요. php-fpm 슬로우 로그는 5~10초, MySQL 슬로우 로그는 1초 이상 걸리는 쿼리를 모두 기록하도록 해두고, 상습적으로 잡히는 함수나 쿼리는 모두 용의자로 취급하셔야 합니다.
답변주셔서 감사합니다.
서버 문제로 여러가지 일이 생겼을때 기진곰님이 정말 큰 힘이 됐습니다
주무셔야할 새벽녁에도 덧글 달아주셔서 정말 감사합니다.
많아봤자 10분당 6명이 출석한 정도에요.