개발 잘해지는 닉네임
290
2021-01-18 10:18:23
9
451

게시판 속도문제 어떻게 해결할 수 있을까요?


게시판이 너무 느린데 속도 개선을 어떻게 해야할지 모르겠어서 질문드려요


저희 게시판은 평소에는 접속자 수가 그리 많지 않은데, 공지같은걸 띄우면 한 순간에 조회수가 20000개 이상까지도 올라갑니다.

이때 사람이 너무 몰려서 게시글 하나 불러오는거에도 30초가 넘게 시간이 걸립니다.


게시글 보기 요청을하면 서버는 다음과 같은 작업을 합니다.

1. 게시글 조회수 1 늘리기

2. 게시글정보 가지고 오기 (조회수 포함 제목, 내용 등등)


제가 생각하기에는 select문은 여러개를 동시에 돌릴 수 있는데 조회수를 늘리는 insert문이 한 순간에 한개밖에 돌아가지 않아서 느려지는 거 같습니다.

그러면 조회수가 딱딱 맞아 떨어지진 않더라도 조금 모아뒀다 일정시간마다 한번에 insert를 해 주는 방식을 취하면 좀 빨라질까요?

그리고 제가 생각하는 느려지는 원인이 맞는지도 궁금합니다. 고수님들 도와주세요 ㅠㅠ


추가로 하드웨어적으로는 뭔가 더 추가하기가 힘들거같아요... 소프트웨어적으로 이상하게 만들어진 부분을 최대한 개선해보고자 합니다 감사합니다!

0
  • 답변 9

  • gdkorea
    476
    2021-01-18 10:52:42

    조회수 늘리는 쿼리를 따로 API로 뻬서 호출 하시는건 어때요?


    글 보는 사람들은 글 내용이 중요하지 조회수가 중요한거 아니잖아요?


    일단 글 내용 보는거 먼저 출력 시키고, 조회수 업데이트 치는거 async로 따로 호출 하는걸로 빼시는게

  • 개발 잘해지는 닉네임
    290
    2021-01-18 11:05:24

    gdkorea 조회수를 늘리는 쿼리를 따로 빼기만 한다고 괜찮을까요? 서버 소스만 보았을 때는 조회수를 늘린다는 1개의 로직이 빠졌기 때문에 빨라지는것 처럼 보이나, 어차피 db는 1개이고 그 db에서 조회수를 올리느라 lock을 먹이기 때문에 다중 사용자 환경에서는 여전히 느릴거 같습니다. (틀렸다면 지적 부탁드립니다.)

    아니면 따로 뺀다는게 당장에 insert를 하지 않고 몰아서 한번에 insert를 하는 로직 추가를 말씀하시는 건가요?

  • gdkorea
    476
    2021-01-18 11:14:18

    그렇게 문제 되면 조회수 테이블을 따로 빼시는건 어떠세요?



    느려진다는게 아마  update 락때문에 그러시는거 같은데. 다른 테이블로 빼면 문제가 안되겠죠?

  • allinux
    1k
    2021-01-18 11:14:35

    성능 이슈를 추측으로 하면 안됩니다.

    일단 프로파일링을 해서 정보를 모으세요. 그리고 분석해서 병목을 찾으세요.

    개선은 그 다음입니다.

  • 개발 잘해지는 닉네임
    290
    2021-01-18 11:23:12

    gdkorea 조회수테이블은 이미 빠져있습니다. 따로 빠져있어도 게시글을 불러올때 update와 select둘 다 하게 되느 여전히 문제가 되는거 같아요... 제자 잘 모르다 보니 질문하는 스킬이 부족했던거 같네요 좀더 알아보고 다시 질문드리겟습니다. 감사합니다!


    allinux db에대해 잘 몰라서 대략적인 원인을 잡고 싶었습니다만 답글해주신 말씀이 맞는거 같네요. 직접 노가다 해보고 다시 질물해봐야 겠습니다. 갑사합니다~

  • yeori
    2k
    2021-01-18 12:10:52

    병목 지점이 어디인지 모르면 뭘 손대야할지 막막합니다.

    * 쿼리가 비효율적인지

    * 디비서버에서 요청을 다 받아내지 못하는지

    * 애초에 web 서버에서 처리할 수 있는 요청의 수가 작은 것인지


    조회수 1 늘리는 쿼리가 30초 지연을 일으키는 핵심 원인인지?

    그게 원인일 수도 있고 아닐 수도 있습니다. 1씩 증가시키는 코드를 제거해보시면 알 수 있겠죠(조회수가 고정되어 있다고 큰 문제를 일으키진 않을테니까요)

    실시간으로 조회수 늘리는 쿼리가 문제였다면 그부분만 배치 형식으로 조회수를 업데이트하게 해주면 될겁니다. 하지만 그게 원인이 아니었다면 할 필요가 없는 작업이겠죠

    쿼리 결과를 캐싱할 것인지, 아니면 판을 키워서 요청을 분산처리하는 loading balacing 작업을 할 것인지, 뭘 하든 먼저 어디가 "병목"인지부터 알아야 합니다.

    편의점 매대에 가서 삼각 김밥을 꺼내드는 식의 편리한 해결책은 없습니다.

  • 쿠잉
    3k
    2021-01-18 12:11:02

    DB 가 무엇인가요? 

  • 박종복
    688
    2021-01-18 13:23:29

    위에 언급한것 처럼 정확한 원인을 찾는게 먼저이긴합니다만

    DB Lock 문제일 가능성이 커보이네요.

    확인해보시고   EHCache와 같은 Cache프레익웍을 이용해 최근데이타를 일부(사용자가 많이 조회를 시도하는 데이타)를 Cache에 넣어두고
    Cache에 없을 경우만 Select SQL을 수행하게 좋지 않을까 합니다.
  • 개발 잘해지는 닉네임
    290
    2021-01-18 14:12:36

    yeori 편한길은 없군요 ㅠ 감사합니다

    쿠잉 postgresql입니다

    박종복 알아보니 insert도 문제이지만 그냥 기본적으로도 느리네요 ㅠㅠ 캐싱에대해 고민해봐야 할거같습니다


  • 로그인을 하시면 답변을 등록할 수 있습니다.