동접자가 300명이 넘어가면서.. > 그누4 질문답변

그누4 질문답변

그누보드4 관련 질문은 QA 로 이전됩니다. QA 그누보드4 바로가기
기존 게시물은 열람만 가능합니다.

동접자가 300명이 넘어가면서.. 정보

동접자가 300명이 넘어가면서..

본문

동접자가 300명(그누보드 현재 접속자 표시기능 기준)이 넘어가니까
 
사이트가 심하게 느려지는군요.
 
이걸 어떻게 해결해야 할지 난감합니다.
 
서버 사양은 에슬론 64bit 2800+ / 2GB RAM 입니다.
하드웨어적인 업그레이드는 좀 부담이되서..
DB 튜닝쪽으로 해결할 방법이 있을까요?
 

댓글 전체

동시접속이 300이라면 장난이 아닌 사이트군요.
그냥 상황을 보지 않은 상태에서 튜닝만으로는 해결이 불가능할것 으로 보입니다.
어떤 부분에서 느려지는지에 대한 분석이 되야 어떻게 튜닝할지에 대한 정보가 나올수있습니다.

다음 질문답변의 글 참고하세요.^^
http://www.sir.co.kr/bbs/board.php?bo_table=g4_qa&wr_id=24750
한가지 더 말씀드린다면 동시접속자가 많을 경우 초기화면에서 index.php의 처리 시간이 많이 걸려 db의 부하가 많이 걸릴수있는데...
index.php를 정해진시간으로 만들어둔것을 사용하도록 처리해서 db쪽으로 요청들어오는것을 줄여 초기 접속의 많은 부하를 줄일수있습니다.
(index.php의 내용을 순수 html로만 처리하도록 만드는 프로그램을 하나 만들어 두신후 크론으로 일정시간 간격으로 호출해서 만드시면 됩니다.)
네에
이것은 제가 그누보드3으로 만들어던 http://i-boss.co.kr 에서 적용했던 방법입니다.
아이보스는 현재 랭키닷컴 순위 전체 1900에서 2000대 사이를 차지 하고 있습니다

처음에 지인이 운영하는 아이보스가
저에게 수정요청 들어왔을땐 메인 페이지만 열리는데 7-8초 걸렸었습니다.
이것을 다음 몇가지를 수정함으로서 해결했습니다.

1. 데이타베이스에서 자료를 가져오는 쿼리중
관리자에 의해 업데이트 되는 것들은 모두 파일데이타로 대치했습니다.
기본 환경 설정
그룹 환경 설정
게시판 환경 설정

이런것들은 관리자에의해 간간이 생성되거나 업데이트 되는 것들입니다.
매 페이지가 열릴때마다 해당 자료를 디비에서 셀렉트 할 필요가 없습니다.
파일데이타로서 관리를 하고
관리자가 새로 생성, 수정, 삭제 시에만 파일데이타를 업데이트 시켜주고
해당 페이지에선 그것을 인클루드 하는 방식을 취하였습니다.
경우에따라 파일을 xml데이터로 만들수도 있고, js로 만들수도 있고, php로 만들어서 인클루드 하여 사용할수도 있겠지만, 저같은 경우는 config파일 처럼 php파일로서 배열로서 저장되도록 하여
그것을 인클루드 하여 사용하였습니다.

2. 중복 쿼리나 중복 처리 같은 것을 찾아내어 없앱니다
그누보드의 소스에 보면 하나의 페이지를 실행하기 위해 여러개의 파일들이 인클루드되고
많은 처리를 하기위해 해당 파일에서 많은 부분을 미리 가져오거나, 미리 처리하는 부분들이 많은데
이것들이 함수나 스킨파일이 인클루드 되면서 거기서 다시 또 가져오거나 처리되는 부분들이 많습니다.
그런부분들을 한번만 처리되도록 효율적으로 수정합니다.

3. 이래저래 해도 속도에 많은 개선을 보지 못했을 경우
각 메인에 대한 처리를 수정합니다.
제가 공개한 Ysummary같은 것을 이용하여
메인에서 뿌려주고 싶은 최신 데이타는 따로 파일로 저장하는 형태를 취하고
일반적으로 가장 많은 셀렉트 쿼리가 사용되는 인덱스, 각 그룹메인등에
그것을 사용합니다.
http://sir.co.kr/bbs/board.php?bo_table=g3_tiptech&wr_id=7536&sca=&sfl=wr_name%2C1&stx=%C0%AF%C3%A2%C8%AD&sop=and



아이보스는 1번과 2번 처리만으로 속도가 아주 많이 빨라졌습니다.
단점이라면 그누보드의 업데이트시
자기가 직접해당 부분을 찾아서 수정해야 한다는 어려움이 있습니다.

3번과 같은 경우는 제가 예전에 스포츠서울의 대카테고리 하나를 통째로 운영할때
1년정도 사용했던 방법입니다.
규모는 phpschool (예전의 왕성했을때의 )정도의 방문자와 데이타업데이트 정도로 생각하면됩니다.

서버는 한번도 뻗은적이 없고, 속도 또한 잘 돌아갔습니다.
서버는 펜티엄 2.8에 메모리 1기가 였습니다.
그리고 이서버에는 그 서비스만 한것이 아니라 A 사의 제휴마케팅 서비스도 같이 돌아가고 있었습니다.

3번까지 처리했는데도 별로 만족 스럽지 못하다면
3번까지 적용한 상태에서 여러가지 공개된 캐슁 시스템을 접목하면 최대한의 효과를 볼수 있습니다.


도움이 되었으면 좋겠습니다
좋은 정보 감사합니다.

제가 관리하는 사이트는 랭키 기준 1500등정도, 그누에 포함된 동시접속 숫자는 평균 350정도, 옵테론 듀얼코어 *2에 램2기가 스카시 하드 사용중이었는데 피크 타임엔 상당히 버벅 거리더군요.. 일단 램을 2기가 추가 했습니다.ㅠ_ㅠ;

고민하던 부분인데 공부 해봐야겠습니다.
그리고 1번에 대한 간단한 예제를 볼수 있나요?
참고할 링크나 예제 있으면 부탁합니다. 즐거운 저녁시간 되세요
그누보드 3에 해당하는 내용들입니다.

그누보드 관리자에서 환경설정을 수정하게 되면
업데이트 파일에서
해당 디비업데이트가 끝난다음,
페이지 이동하기 전에 Ysave_default() 를 한번 호출합니다.

Ysave_default() 은 디비의 환경설정 테이블의 데이타를 가져와서
미리정의된 php파일경로에 새로운 내용을 덮어쒸어 저장하는 역활을 합니다.
데이타는 여러가지 이유에서 base64_encode 하여 저장합니다.

그누보드 3의 경우 index.php파일에서 모든 것을 처리하는데
거기에 보면 환경설정부분을 데이타베이스에서 가져오는 부분이 있습니다.
그것을 $default = Yget_default() 으로 바꿉니다.

그룹이나 게시판 역시 이런식으로 처리하면 됩니다.

이해가 되셨으면 좋겠습니다.


//파일쓰기
function Ywritefile($file, $text, $option="w"){

  $fp = @fopen ($file, $option);
  @flock($fp, LOCK_EX);
  @fwrite($fp, $text);
  @flock($fp, LOCK_UN);
  @fclose($fp);
  @chmod($file, 0777);
}



//배열 base64_decode
function Yarray_base64_decode($array){

  if (is_array($array)){

    foreach ($array as $key => $value){

      $value = base64_decode($value);
      $temp[$key] = $value;
    }

    return $temp;
  }
  else return false;
}



//기본환경설정 화일에 저장
function Ysave_default(){

  global $Yconf, $cfg;

  $result = @mysql_query("select * from " . $cfg["table_default"]);
  $Yde_data = @mysql_fetch_array($result);
  @mysql_free_result($result);

  $Ytext = "";
  if (is_array($Yde_data)){

    foreach ($Yde_data as $key => $value){

      $value = base64_encode($value);
      $Ytext .= "\$Ydefault[\"" . $key . "\"] = \"" . $value . "\";\n";
    }

    $Ytext = "<?php\n\n\n\n" . $Ytext . "\n\n\n?>";

    //파일에 저장
    Ywritefile($Yconf["file_default"], $Ytext);
  }
  else{

    alert("기본환경설정이 존재하지 않습니다.");
  }
}



//기본환경설정 화일 가져오기
function Yget_default($num=0){

  global $Yconf, $cfg;

  //데이타 파일이 없는 경우 직접 데이타베이스에서 가져옴
  if ($num == 2) {
   
    $result = @mysql_query("select * from " . $cfg["table_default"]);
    $Yde_data = @mysql_fetch_array($result);
    @mysql_free_result($result);
    return $Yde_data;
  }
  else{//저장된 환경설정 파일에서 데이타를 가져와서 디코딩 하여 리턴

    if (is_file($Yconf["file_default"]) && filesize($Yconf["file_default"]) > 0) {

      include $Yconf["file_default"];

      $default = Yarray_base64_decode($Ydefault);
      if ($default == false){

        Ysave_default();
        $num++;
        $default = Yget_default($num);
      }
    }
    else{

      Ysave_default();
      $num++;
      $default = Yget_default($num);
    }

    return $default;
  }
}
일단 기본 환경설정을 파일로 저장해 불러오는것 까지 성공했습니다.
잘 ~ 됩니다.

감사합니다.^^

3번 항목도 해봐야겠습니다.
기본적인시스템의 부하를 먼저 점검해보세요.
CPU, RAM 사용율과 네트웍 트래픽을 알아야 할거 같습니다. 네트웍에 버틀랙이 걸여있을 수도 있습니다.
그게 아니고 CPU와 RAM의 사용이 많다면 어떤 프로그램이 많이 사용되는지를 봐야 합니다.
너무도 자세한 답변들 감사드립니다.
일단 알려주신 내용들 참고로 적용해보고 다시 질문 드리겠습니다.

정말 감사합니다 ^^
전체 66,558 |RSS
그누4 질문답변 내용 검색

회원로그인

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