본문 바로가기

Software/Mediawiki

[Mediawiki] 미디어 위키 속도 향상 ( Feat. Fatal error: Maximum execution time of ... seconds exceeded in 에러 )

1. 문제 상황


미디어 위키 api를 날릴 때, 위키 내에 검색 결과는 존재하지만 페이지로 연결이 안되는 이슈가 있었다.

클릭 시 페이지가 뜨지 않음

 

 

이때, api는 Maximum execution time인 120 second 동안 계속해서 요청을 시도하게 되고 전체 위키 페이지의 데이터 수집시 병목이 발생하였다.

 

 

해당 상황에 대한 임시방편 대안으로 고안한 것은 maximum time을 좀 더 작게 잡고 해당 시간 내에 도달하지 않는 경우 없는 문서로 취급하여 넘기도록 하는 것이었다.

 

 

 

 

2. Maximum execution time 설정


1. 미디어 위키 설치 시 생성한 LocalSettings.php 를 찾는다.

 

Ex) /opt/lampp/htdocs/mediawiki-1.36.1/ 

 

 

 

2. LocalSettings의 하단부에 set_time_limit 설정을 추가한다.

set_time_limit(30);

 

 

하지만 해당 대안은 말 그대로 임시해결이었기 때문에, 분명 페이지가 존재하지만 api의 병목 때문에 time limit에 걸려 응답이 제한되는 경우 데이터 누락이 발생하였다.

 

40s 응답시간의 페이지의 경우 누락 발생

 

 

 

따라서 근본적인 문제를 해결하기 위해 미디어 위키 API 속도 개선에 초점을 맞췄다.

 

 

 

3. 미디어 위키 속도 향상을 위한 설정


미디어 위키는 기본적으로 성능 향상을 위한 설정이 모두 비활성화 되어있다는 사실을 알게 되었지만, 이미 성능 튜닝을 위한 메뉴얼이 존재했다.

 

 

1. 메인 캐시 타입을 APC로 구성한다.

미디어 위키의 기본 캐시는 기본적으로 비활성화되어 있으므로 수동으로 구성해야 한다.

먼저 APCu를 설치해준다.

 

1. APCu 설치

$ sudo apt-get(혹은 yum) install php-apcu php-igbinary


2. LocalSettings에서 해당 부분을 APC 캐시로 설정해준다.

// Default:
// $wgMainCacheType = CACHE_NONE;
$wgMainCacheType = CACHE_ACCEL;

 

 

APC란?
  • Alternative PHP Cache
  • 웹서버 최적화를 위한 cache 종류 중 하나
  • 아래 두 종류의 Cache가 합쳐진 PHP 확장 모듈
    1. PHP 페이지를 호출할때마다 해석하지 않고 미리 HTML 문서로 모아두는 Cache
    2. PHP 요청에 따라 데이타베이스에서 작업한 결과를 모아두는 Cache
  • 현재는 개발이 중단되었으며 opcode 캐시 기능이 제외되고 데이터 스토어 기능만 지원하는 APCu로 대체되었다.

 

 

2. 캐시파일을 저장할 디렉토리를 설정한다.

 

LocalSettings.php에서 주석처리 되어있는 해당 라인을 주석 해제하고 $IP 부분에 미디어 위키가 설치된 최상위 디렉토리를 넣는다.

(아래 코드는 참고를 위한 본인의 $IP)

// Default:
// $wgCacheDirectory = "$IP/cache";
$wgCacheDirectory = "/opt/lampp/htdocs/mediawiki-1.36.1/cache/";

 

 

3. 파일 캐시를 설정한다.

파일 캐시는 위키 문서를 html로 만들어두고 제공하는 캐시이다. DB Hit 없이 준비된 html을 그대로 전송하므로 서버부하 감소, 응답속도 개선의 효과가 있다.

LocalSettings 하단에 아래 코드를 추가한다.

$wgUseFileCache=true;
$wgFileCacheDirectory="$IP/cache";

 

 

 

4. doJobs() 실행횟수를 줄인다.

 

미디어 위키 설명 문서에 따르면, $wgJobRunRate는 요청당 작업을 0에서 1사이의 확률로 수행하게 된다. 0이 아닌 정수(1 이상)로 설정하면 요청당 그만큼 많은 작업이 수행된다.

기본적으로 요청이 실행될 때마다 작업 대기열(job queue)에서 하나의 작업이 선택되어 실행되고, 따라서$wgJobRunRate를 줄여서 해당 성능 부담을 감소시킬 수 있다고 한다 . LocalSettings에 아래 코드를 추가한다.

$wgJobRunRate  =  0.01 ;

 

이는 평균적으로 100개의 페이지 보기마다 Job queue의 항목 하나가 실행된다는 의미이다.

 

 

 

Ref.

https://www.mediawiki.org/wiki/Topic:Pp1ot87j322391k6

https://www.mediawiki.org/wiki/Manual:Performance_tuning

https://www.mediawiki.org/wiki/Manual:$wgJobRunRate