현재 서버 사양 입니다.

CPU Core : 4개

Ram : 4GB

HDD : 200GB

Nginx, MySQL[InnoDB],php7.0, 그누보드5[아미나 빌더]

최적화 작업 : Nginx - X ,MySQL[InnoDB] - X ,php7.0 - X

현재 저희 사이트는 평균 동접 400명대, 피크타임 평균 동접 800명대 입니다.

1시간전에 접속자 수가 810명대로 증가하더니 갑자기 서버에 렉이 걸리기 시작하면서 서버가 터지려고 했습니다.

0.8초만에 로딩되던 페이지가 7초씩 걸리고, 엄청 오래 기다린후에 로딩이 완료되었습니다.

처음에는 회선 문제 인가 싶었지만,

아무리 봐도 회선문제는 아니어서 서버를 재부팅하였더니, 렉이 걸리지않고 정상적으로 작동하였습니다.

그 당시 서버의 Load average는 2.47 2.67 2.78 이었습니다.

램 사용량은 490mb 였습니다. [htop 명령어를 통해 확인하였습니다.]

서버는 6일전 재부팅한것을 제외하고는 재부팅을 한 적이 없습니다.

일단 임시적으로 crontab을 이용해 매일 05:30마다 재부팅을 하게 해놨는데, 대체 무슨 문제인지 모르겠습니다.

제가 더 알려드려야할 정보가 있으시면 덧글로 말씀해주세요.

해결책 알려주시면 감사하겠습니다.

  • profile

    가상서버에 4코어/4GB/200GB 사양이라면 스쿨호스팅인가요? ㅎㅎ

     

    우선 램 사용량이 너무 낮습니다. 특히 InnoDB라면 기본으로 1기가는 먹고 들어가곤 하는데,

    4기가 중 490메가밖에 사용하고 있지 않다면 MySQL 설정에 문제가 있는 듯 합니다.

    우선 my.cnf에서 innodb_buffer_pool_size를 1G 이상으로 높이고 MySQL을 재시작해 보세요.

     

    (단, 그누보드는 게시판을 추가하면 무조건 MyISAM으로 테이블을 생성하는 습성이 있기 때문에

    실제로 모든 테이블이 InnoDB로 되어 있는지 확인하셔야 합니다. 그렇지 않다면 위의 설정은 무의미해요.)

     

    접속자가 많아질 시간대에 htop에서 PHP-FPM 프로세스가 몇 개 떠있는지도 확인해 보세요.

    리눅스 종류에 따라서는 기본값이 5개로 제한되어 있어서 접속자가 늘어나면 감당을 못하기도 합니다.

    4코어 CPU에 램이 4기가라면 PHP-FPM 프로세스는 10~20개 정도 떠있어도 됩니다.

     

    서버 소프트웨어 튜닝이 필요한 이유가 바로 이런 것들입니다.

    CPU와 램을 아무리 많이 달아놔도 PHP와 MySQL이 그걸 제대로 활용하도록 설정되어 있지 않으면

    몇만원짜리 서버를 임대해 놓고도 몇천원어치 사양밖에 못 쓰는 불상사가 발생합니다.

  • profile ?
    안녕하세요, 기진곰님.
    늦은 새벽에도 덧글 달아주셔서 정말 감사합니다.
    말씀하신대로 그누보드 모든 테이블이 전부 MyISAM 엔진이더라구요.
    테이블에 세팅 되어있는 엔진을 InnoDB로 변경한 후 my.cnf innodb_buffer_pool_size를 1GB로 설정하면 되나요?

    확인 결과 php-fpm은 13개 떠있습니다.
    혹여나 그누보드5 접속자 로그 기록이 슬로우 쿼리를 유발하지 않았는지 궁금합니다.
  • profile ?
    그리고 저희 서버는 피크타임때 약 600명은 눈팅만하고 약 200명은 글을 쓰거나, 덧글,추천,쪽지를 답니다.
    InnoDB 사용이 필수적인가요?
  • ? profile

    MySQL을 사용하는 모든 사이트는 InnoDB를 사용하는 것이 좋습니다. 2017년 현재 MyISAM이 InnoDB보다 나은 구석이라고는 단 한 가지도 없어요.

     

    웹호스팅에서 MyISAM을 고집하는 이유는 고정적으로 잡아먹는 RAM 용량이 적기 때문에 더 많은 고객을 한 서버에 구겨넣기 편해서입니다. 성능이 좋아서가 아닙니다. 성능을 떨어뜨려서라도 수익성을 추구하는 웹호스팅의 특성이지요. 웹호스팅이 아니라면 MyISAM은 거들떠볼 필요도 없습니다.

  • profile ?
    http://kb.globalsoft.co.kr/web/web_view.php?notice_no=311
    여기를 보면 단순히 테이블 엔진을 변경하는것보다 새로 테이블을 생성하고 하라는데 이렇게 해야되나요?
  • ? profile

    그냥 엔진 변경하셔도 됩니다. (단, innodb_buffer_pool_size를 늘리고 MySQL을 재시작한 후에 변경하시기 바랍니다.)

    링크하신 글에서 처리속도가 떨어질 수 있다고 해놓은 것은 변경하는 도중에 잠시 속도가 떨어진다는 뜻이지, 변경 후에는 아무런 차이가 없습니다. 서버에서 테이블 엔진 변경을 위해 대량의 데이터를 처리하고 있으면 속도가 떨어지는 것은 당연하지요. 방문자가 아주 많은 사이트라면 이게 문제가 될 수도 있겠지만, 그렇지 않다면 사용자가 비교적 적은 시간대에 잠시 엔진 변경하셔도 별 문제 없습니다.

    풀텍스트 인덱스를 지원하지 않는다는 InnoDB의 단점도 저 글이 쓰여진 시절에는 사실이었지만 최신 버전 기준으로는 더이상 해당되지 않습니다. XE에서는 WHERE절 없이 테이블 전체에 대해 SELECT COUNT(*)하는 일도 거의 없으니, 사실상 단점이라고 할 만한 것이 전혀 없지요.

     

    그런데 그누보드는 게시판 추가할 때마다 테이블을 InnoDB로 바꿔주셔야 합니다 ㅠㅠ common.php에서 MyISAM을 찾아 InnoDB로 바꾸면 게시판은 일단 괜찮긴 한데, 그 밖에도 여기저기 MyISAM으로 고정된 부분이 많아요.

  • profile ?
    안녕하세요, 기진곰님
    말씀하신대로 모든 테이블의 엔진을 변경하였습니다.
    변경 중 약간의 속도 저하가 있었지만 잠시뿐이었습니다.
    그리고 기진곰님,
    혹시 동접자 2000명~3000명 정도의 [그누보드5+서버(Nginx,php-fpm,MariaDB]튜닝은 비용이 대략 어느정도 들어가는지 알려주시면 감사하겠습니다.
    저희 서버 동접자 늘어나는걸 보면 내년 3월달쯤에는 2000명~3000명 정도 찍을 것 같아서 미리 문의드립니다.
  • ? profile

    여러 가지 변수가 있기 때문에 딱 잘라서 말씀드리기 어렵습니다.

    예를 들면 InnoDB의 특성상 DB 용량이 버퍼 용량을 넘어가면 성능이 급격히 나빠지기 때문에 동접수뿐 아니라 DB에 쌓여 있는 데이터의 총 용량에도 영향을 받습니다. 사용자가 줄어더라도 시간이 지남에 따라 서버 사양을 점점 높여야 하는 상황이 발생하지요. 어쨌거나 동접수가 2~3천명대로 늘어나면 단독서버나 상위 상품으로 옮기셔야 할 가능성이 높습니다.

    성능 문제를 일으키는 특정 애드온이나 위젯을 콕 찝어 대응할 수 있는 XE와 달리, 그누보드는 스킨이나 빌더 등 여기저기에서 무분별하게 쿼리를 날려대기 때문에 진단하는 것부터 상당히 복잡합니다. DB 스키마가 깔끔하게 정의되지 않다 보니 서드파티 자료는 물론이고 그누보드 "코어"에서 생성하는 테이블마저 일반적인 검색 패턴에 맞는 인덱스를 제대로 걸어놓지 않는 일이 흔하고요. 덕분에 인덱스 몇 개 걸어주니까 갑자기 성능이 수십 배 나아지는 기적이 일어나기도 하지만, 반대로 스킨을 일일이 뜯어고치는 삽질을 해야 하는 경우도 있습니다.

  • profile ?
    그렇다면 따로 그누보드5 전문가를 찾아서 튜닝을 해야되나요?
  • ? profile

    꼭 그렇지는 않아요. XE에 비해 변수가 많기 때문에 비용을 예측하기 힘든 것 뿐입니다.

    저도 정확하게 진단을 해보기 전에는 튜닝 견적을 제시하지 않습니다.