댓글이 많아질때 속도저하문제

댓글이 많아질때 속도저하문제

QA

댓글이 많아질때 속도저하문제

본문

안녕하세요

운영중인 사이트의 게시물에 댓글이 많아지니 게시물을 읽어들이는 속도가 저하되는 문제가 있습니다.

생각보다 문제가 심각해서 댓글은 50개 가량인데, 게시물을 읽어들이는데 5초이상이 걸리더라구요

(참고로 댓글 1-2개인글은 1초미만으로 굉장히 빠르게 잘 읽어들입니다)

 

정확한 원인분석을 위해 개발자도구로 살펴봤더니, 용량이 큰 이미지나 css등의 요소는 없고 순전히 php로직이 돌면서 응답을 늦게 쏴주는거더라구요.

 

그런데 어느부분을 수정해야할지 도저히 모르겠는게..

아래 사이트를 참고하여 의심되는 부분 앞뒤로 소요시간을 보았는데

https://d4emon.tistory.com/22

 

view.skin.php파일의 코멘트 입출력부분을 위/아래로 감쌌을땐 소요시간이 5초라고 나왔거든요.

(아래 코드를 감싼부분)

    <?php

    // 코멘트 입출력

    include_once(G5_BBS_PATH.'/view_comment.php');

     ?>

그래서 view_comment.php에서 어떤 요소가 시간을 잡아먹는지 봐야겠다고 살펴봤는데

이 코드 자체는 소요시간이 얼마 안되더라구요?

심지어 view_comment.php의 제일 윗부분과 제일 아랫부분을 microtime으로 시간을 측정해보았더니 소요시간은 0.01초라고 뜹니다;;

 

그러면 include_once를 하는 과정에서 무언가 속도를 저하시키는걸까요?

제 추측으로는 view_comment.php의 for문이 돌면서 속도를 저하시키는것같은데, 그 for문안에 어떤 코드가 문제인지를 파악하고싶었거든요.. 그 방법에대해서도 궁금합니다

 

 

추가로 좀 특이한건..

댓글이 50개인 글이 5초가 걸린다치면

일시적으로 view_comment.php의 for문의 반복을 2회로 제한했을때(즉, 댓글이 2개만 보이게)

읽어들이는 시간이 줄어들어 빨라질거라 예상을 했는데 예상과 반대로 역시 5초가 걸리는 상태입니다

도움좀 부탁드립니다

이 질문에 댓글 쓰기 :

답변 8

해당 게시판에 누적된 데이터가 많아

해당 쿼리 질의 자체가 오래 걸리는것으로 보이네요.

질의 할때 WHERE절에 입력된  조건 등이 있을텐데 해당 컬럼을 인덱스로 지정하시거나, 

그래도 문제가 된다면 별도의 캐시를 이용하시거나 등 db 질의 후 얻어오는 데이터 속도 자체를 개선하셔야 합니다.

일반적으로 시스템적으로 개선이 어려운 사이트에서는 db에 일정한 데이터가 쌓이면 새로 db를 개설하여 (구)게시판으로 남겨 볼 수 있게만 해놓고, 새로운 게시판을 만들어 처리하는 경우가 많습니다.

원인, 또는 원인지점을 정확하게 찾아야.. 그에 맞는 해결책이 나옵니다.

 

1차로 

include_once(G5_BBS_PATH.'/view_comment.php');

 

를 뺐을 때 속도지연 현상이 없는지 살펴볼 수 있고..

 

속도지연 현상이 있다면..

해당 부분에서 select 쿼리 부분을 출력하여 DB 에 직접 실행했을 때.. 몇 초 걸리는 지 측정해 볼 수 있습니다.

 

& view_comment.php 에서 특정구간 마다 exit; 코드 삽입으로 속도지연 구간 체크

 

이런 작업들을 통해 원인 또는 원인지점을 정확하게 찾는 것이 가장 중요합니다.

query가 느린 경우, 서버 호스팅을 하신다면 Slow Query Log를 한번 살펴 보세요.

https://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html

그리고

view_comment.php

여기 첫줄 바로 return;하면 시간이 어떻게 되는지 한번 측정해 보세요.

댓글이 50개씩 달릴 정도면 사람이 많다는 것일테고,

사람이 많으면 게시판에 게시글도 아주 많을테고....

그럼, 서버가 빵빵하지 않으면 사람 많을 때 버벅....

사람 없을 때도 버벅일 정도면 서버가 영 ~~~~~

 

ps.

이토 사이트도 1만 개 정도 넘어가면 게시판 새로 만들어 운영하더라구요.

 

보통 일반적인 호스팅은

DB서버의 속도를 보장할수없습니다.

 

게시글이 많아지거나 댓글이 많아지면 

쿼리수행속도가 현저하게 저하됩니다.

 

사용자가 많은 사이트라면

단독서버호스팅을 추천하고,  (서버설정을 알아서 해야 하겠지만요)

 

비용이 문제라면 좀더 나은 호스팅사양으로라도 변경하시길 권장합니다.

 

그리고나서 느리면 쿼리에 튜닝을 해야겠죠

(병행하는것도 좋지만.. 서버성능이 우선이라고 봅니다)

 

for문은 이미 쿼리가 실행되고 데이터를 가져오는 과정입니다.  쿼리에 limit 를 변경해서 테스트 해보세요.

 

댓글 50개 정도로 느려진다면 가상서버로 옮겨보는것도 좋은 방법일듯 합니다.

 

먼저 

그누보드 - 검색 : 댓글 페이징 (sir.kr)

적용해보세요

볼피드님 답변처럼 인덱스 작업이 필요합니다.

댓글이 수천개가 되면 튜닝 작업 조금 하셔야합니다..

동일한 작업 많이해보았습니다.

쪽지로 연락처 남겨주시면 살짝 증세 봐드리겠습니다.

댓글, 전체 게시물 갯수 어느정도인가요?

bbs/"view_comment.php"에 보면


// 코멘트 출력
//$sql = " select * from {$write_table} where wr_parent = '{$wr_id}' and wr_is_comment = 1 order by wr_comment desc, wr_comment_reply ";
$sql = " select * from $write_table where wr_parent = '$wr_id' and wr_is_comment = 1 order by wr_comment, wr_comment_reply ";
$result = sql_query($sql);
for ($i=0; $row=sql_fetch_array($result); $i++)
{ ...

이런 부분이 있는데


 show index from g5_write_notice;
+-----------------+------------+---------------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table           | Non_unique | Key_name            | Seq_in_index | Column_name   | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-----------------+------------+---------------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| g5_write_notice |          0 | PRIMARY             |            1 | wr_id         | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| g5_write_notice |          1 | wr_num_reply_parent |            1 | wr_num        | A         |        NULL |     NULL | NULL   |      | BTREE      |         |               |
| g5_write_notice |          1 | wr_num_reply_parent |            2 | wr_reply      | A         |        NULL |     NULL | NULL   |      | BTREE      |         |               |
| g5_write_notice |          1 | wr_num_reply_parent |            3 | wr_parent     | A         |        NULL |     NULL | NULL   |      | BTREE      |         |               |
| g5_write_notice |          1 | wr_is_comment       |            1 | wr_is_comment | A         |        NULL |     NULL | NULL   |      | BTREE      |         |               |
| g5_write_notice |          1 | wr_is_comment       |            2 | wr_id         | A         |        NULL |     NULL | NULL   |      | BTREE      |         |               |
+-----------------+------------+---------------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
6 rows in set (0.00 sec)

막상 index를 보면

이용할 수 있는 index key가 없습니다.

wr_parent가 들어 가는 인데스를 하나 더 만들어 보시기 바랍니다.

 wr_is_comment(wr_is_comment,wr_id) 이 인덱스 키에서

wr_id 대신 wr_parent를 넣어 보시는 것도 좋을 듯합니다.

 

답변을 작성하시기 전에 로그인 해주세요.
전체 123,592 | RSS
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT