nginx + php 7.2 + php-fpm + mariadb 로 구성된 서버입니다.
20기가 메모리에서 14기가를 mysql에 주고 6기가로 php-fpm에 설정했습니다.
기진곰님의 메모리 관리에 관한 글이 도움이 많이 되었습니다.
요근래 mysql이 cpu 부하가 100%를 넘기더니 이제는 200%에 육박합니다.
몇가지 원인을 찾다가 라이믹스 디버그 기능으로 쿼리를 찾아보는데 결과가 아래와 같습니다.
Slow Triggers (1)
- Target: supercachecontroller.triggerBeforeGetDocumentList
- Exec Time: 21.3309 sec
슈퍼캐쉬와 관련이 있는건지 일단 슈퍼캐쉬를 지우거나 끄지는 않았고, 글 작성후에 슈퍼캐쉬를 만져볼려고 합니다.
질문은 제가 몇가지 설정을 만지고 이런 결과가 나온거 같은 기억이 나는데 그게 뭘 만졌는지는 정확하게 기억이 안나고 있습니다.
혹시 저와 같은 경험을 해보신 분이 계신지 궁금합니다.
슬로우 쿼리 2차 증세가 나왔네요. 이건 슈퍼캐쉬를 끄고 나오는 결과입니다.
Slow Queries (2)
- Caller: modules/document/document.model.php:254
(documentModel->getDocumentList) - Connection: master (localhost)
- Query ID: document.getDocumentList
- Query Time: 4.9970 sec
- Result: success
- Caller: modules/document/document.model.php:254
(documentModel->getDocumentList) - Connection: master (localhost)
- Query ID: document.getDocumentList
- Query Time: 11.1768 sec
- Result: success
계속 테스트 해보는데 ducument 모듈에서 슬로우 쿼리가 걸립니다.
Slow Queries (2)
- Caller: modules/document/document.model.php:254
(documentModel->getDocumentList) - Connection: master (localhost)
- Query ID: document.getDocumentList
- Query Time: 8.0621 sec
- Result: success
- Caller: modules/document/document.model.php:254
(documentModel->getDocumentList) - Connection: master (localhost)
- Query ID: document.getDocumentList
- Query Time: 23.9833 sec
- Result: success
그럼, 이걸 어떻게 해석해야 할까요.
mysql이 부하가 걸려서 라이믹스에서 슬로우 쿼리가 걸리는 건지..
아니면 라이믹스에서 슬로우 쿼리가 걸려서 mysql cpu 부하가 걸리는 건지..
DB에 문제가 있어서 쿼리를 실행하는 데 8~23초나 걸리니까 라이믹스에 슬로우 쿼리라고 뜨는 거죠. 라이믹스는 슬로우 쿼리를 유발하지 않습니다. 슬로우 쿼리가 발생하면 곧이곧대로 보고할 뿐입니다.
슈퍼캐시는 느린 쿼리 결과를 캐싱하여, 느린 쿼리가 자주 발생하지 않도록 해줄 뿐입니다. 슈퍼캐시를 끄면 본색이 드러나지요. 게시판에 글 수가 많다면 getDocumentList 쿼리에 긴 시간이 걸리는 것은 무척 흔한 일입니다.
1. 목록에서 공지글을 제외하는 옵션을 꺼 보세요. 무척 간단한 옵션인데 의외로 이 옵션이 성능에 큰 영향을 줍니다. 글이 많이 쌓여 있는 사이트라면 무조건 끄고 (즉, 공지글이 목록에 중복 노출되는 상태로) 운영하시기를 권장합니다. 쿼리문을 자세히 보면 아시겠지만 WHERE 조건이 2개에서 3개로 늘어나거든요. 2개까지는 적절한 복합인덱스를 탈 수 있는데, 3개가 되면 DB가 난감해합니다.
2. DB에서 직접 ANALYZE TABLE xe_documents; 쿼리를 실행해 보세요. 그동안 누적된 데이터 분량이 많고 최근에 DB 튜닝값이 변경되었다면 주요 테이블에서 이걸 한 번씩 실행해 줘야 쿼리 최적화가 제대로 됩니다.