워드프레스 속도 개선과 CRON

워드프레스에서는 예약발행과 같이 미래의 지정된 시간에 특정 작업을 예약하거나, 버전 업데이트 확인 등과 같이 일정 주기로 특정 작업을 수행하도록 예약하는 방식을 지원하는데요(WP Cron), 코어에서도 그렇지만 많은 플러그인과 테마, 프레임웍 등에서 이러한 예약작업을 등록합니다. 이 외에도 주기적으로 캐시했던 데이터를 지우고 새로 캐시를 생성하는데도 사용되기도 하는 등 아주 다양하게 활용되고 있습니다.

우선, CRON 이라고 하는 것은 UNIX 기반 시스템에서 시간을 기준으로 작업을 수행하는 프로그램(명령)입니다. 한마디로 작업 스케줄러라고 보시면 되는 것이죠.

이 CRON 이라는 것이 기본적으로는 시스템 백그라운드에서 실행되는 것으로서 사용자에게는 거의 영향을 미치지 않는 것이 기본이지만, 워드프레스라는 웹 어플리케이션에서 시스템에 접근할 수 있는 권한이 한정적이기도 하고 일반적인 호스팅에서는 이를 지원하지 않기 때문에(보안, 리소스 관리) 워드프레스 자체적으로 이를 지원하도록 만든것이 WP Cron 입니다.

이에 따라서 사용자들이 사이트에 접속하여 페이지를 로딩하는 중간에 예약된 작업을 백그라운드에서 실행하는 과정에서 수초에서 길게는 몇 분가량 페이지 로딩이 지연되는 경우가 있게 됩니다.

통상적으로 시간이 오래 걸리는 예약 작업은 사이트 관리자가 페이지를 로드할 때만 적용되긴 하지만, 다양한 플러그인과 테마를 사용하다 보면 그렇지 않은 경우도 종종 발생하게 됩니다.

사이트 페이지 로딩이 매번 느린 경우가 아니라 간헐적으로 한번씩 느려지는 경우라면 CRON 작업을 하고 있구나 라고 예상하셔도 좋을 것입니다.

아래 언급드리는 내용은 국내의 일반 호스팅 사용자라면 적용할 수 없는 사항이라는 것을 미리 말씀드리도록 하겠습니다. 단독(가상, 클라우드)서버를 통해 (U)NIX 환경에서 사이트를 운영중이시거나, cPanel 과 같은 툴을 제공하는 해외 호스팅을 사용중인 분들이라면 WP Cron을 막아두고 시스템의 CRON을 통해 예약 작업을 수행함으로서 이러한 지연 현상을 방지할 수 있습니다.

우선, WP Cron 을 막는 방법은 wp-config.php 파일을 열어 아래 내용 한 줄을 추가해 주시면 됩니다.

이제 시스템 상에서 워드프레스의 예약 작업을 수행하도록 등록해 보겠습니다.

단독 서버를 운영중일 경우(telnet/ssh를 통해 서버에 접속)

  • $ crontab -e # 예약작업 등록/수정 명령어
  • 그리고 뜨는 화면에서 아래 내용을 한 줄 추가해 주시면 됩니다.(사이트 주소는 자신의 것으로 변경해야 함)
  • 위 예제는 15분에 한번씩 예약 작업 수행요청을 하고, 등록된 작업이 있다면 수행하는 명령입니다. 자세한 crontab 사용법은 구글 등에서 검색해 보시거나, 이 페이지를 참고해 보세요. 예약작업이 아주 많다면 시간단위를 짧게 하실 수 있고, 그렇지 않다면 더 길게 잡으시면 됩니다.

cPanel 을 통한 예약작업 등록

  • cPanel 에 로그인
  • Advanced 섹션에서, Cron jobs 클릭.
  • Add New Cron Job 에서, time interval 을 선택합니다. (HostGator 에서는 15분 이상을 선택하길 권장합니다.)
  • cron 명령에 아래와 같은 내용을 추가해 합니다.(사이트 주소는 자신의 것으로 변경해야 함)

 

Query Monitor 플러그인 소개

개발자 혹은 사이트 제작자를 위한 플러그인을 하나 소개할까 합니다.

Query Monitor

banner-772x250
어떤 특정 페이지 혹은 관리자 화면에서 페이지 로딩시간이 눈에띄게 늘어나는 경우가 있는데요, 이 경우 원인을 파악하기란 정말 쉽지 않습니다.
 
플러그인을 하나하나 비활성화 해 가면서 원인이 되는 플러그인을 찾아 볼 수 는 있지만 어떤 부분에서 지체가 되는지를 파악하려면 아주 많은 경험에 운까지 필요하곤 하지요.
이럴 때 큰 도움이 되는 플러그인이 바로 Query Monitor 플러그인입니다.
 
페이지 로딩 타임(PHP), MySQL Query Time, 메모리 사용 등 기본 정보 이외에도 디버깅에 필요한 대부분의 정보를 한 눈에 파악할 수 있습니다.

데이터베이스 Queries

  • 현재 페이지에 호출된 모든 query
  • 영향을 받은 row들과 질의(query)에 걸린 시간
  • slow queries, 오류가 있는 query 에 대한 알림
  • 다양한 필터링 기능

Hooks

  • 현재 페이지에서 호출된 모든 후크(hooks) 정보
  • 다양한 필터링 기능

PHP 오류

  • 오류, 경고, 정보성 알림 등 PHP 오류를 정리하여 보여줌

HTTP Requests

  • 현재 페이지에서의 모든 HTTP 요청(워드프레스 HTTP API 이용)에 대한 정보와 소요시간 표시

이 외에도 서버환경, 테마, 템플릿, AJAX 등 생각할 수 있는 거의 모든 정보를 한 번에 볼 수 있도록 해 줍니다.

참고로 제가 이번에 찾은 원인은 바로 Jetpack 플러그인의 ‘alert_identity_crisis()’ 함수에서 jetpack 서버로의 호출이 매 페이지마다 발생하는 중에 가끔씩 name lookup timeout 이 걸리면서(jetpack 서버의 늦은 반응으로) 10초 가량 로딩이 지연되는 경우였습니다.

slow-loading-monitor

이 플러그인 아니었으면, 몇 시간을 그냥 날릴뻔 했는데 말이지요;-)