[워드프레스 최적화] 워드프레스 성능 개선을 위한 데이타베이스(MariaDB) 최적화 방법

|

오늘은 워드프레스 운영을 위해 Vultr 가상서버호스팅(VPS)에 서버 설치 후 최적화하는 방안에 대해서 살펴보고 있습니다.
서버 최적화는 웹서버 최적화, DB 최적화 그리고 PHP 최적화등으로 나누어질 수 있는데요. 오늘은 이 중 DB 최적화에 대해 살펴 보겠습니다.

여기 워드프레스를 설치한 서버에는 MariaDB가 기본으로 설치되어 있으므로 MariaDB 최적화 방안 중심으로 살펴 보겠습니다.
사실 그동안 DB 부분은 접근할 엄두가 나지 않았고, 최적화가 크게 필요 없다는 생각을 했는데, 자료를 보다보니 여기에서의 최적화가 절대적으로 필요하다고 하고, 여기까지 최적화하지 않으면 두고 두고 후회할 것 같아 없는 시간을 내서 시도해 보았습니다.

1. my.cnf 위치

MariaDB를 설치했기 때문에 InnoDB 최적화에 대한 내용이니 참고하시는게 좋겠습니다.

다 아시는 것처럼 MariaDB를최적화하기 위해서는 my.cnf에서 설정을 변경해 주는데요.
이 파일은 /etc/my.cnf 또는 /etc/mysql/my.cnf에 위치하고 있습니다.

2. 최적 메모리에 대한 생각

MariaDB 최적화를 위해서 자료를 조사하다보니 메모이이야기 많이 나옵니다. 메모리는 많으면 많을수록 좋다는게 일반적인 상식이고, 이 DB와 관련해서도 마찬가지입니다.

DB가 작업하는 공간이 속도가 빠른 메모리에서 모두 진행하는게 속도를 올릴 수 있는 지름길이기 때문이죠.

그러면 도대체 어느 정도 메모리를 가지고 있어야 할까요?

일반적으로 메모리의 크기는 최소 데이타베이스 크기 정도는 확보해야 한다고 합니다. 데이타베이스 크기와 RAM의 크기가 비숫하면 별다른 세팅을 하지 않고도 어느 정도 성능을 낼 수 있다고 합니다. 만약 6GB의 데이타베이스가 있다면 메모리도 최소 6GB가 있어야 하고 이보다도 20%~30%정도 더 메모리가 있다면 최상이라는 것이죠.

그러나 일반적으로 비용의 문제이기 때문에 충분한 메모리를 가지지 못하는 경우가 생기죠. 이렇게 서버에 충분한 메모리가 없는 경우 제대로 된 MySQL/MarianDB가 작동하지 않을 수 있습니다. 그렇기에 최적화가 필요합니다.

3. MariaDB 필수 최적화 항목들

my.cnf에는 많은 설정 변수들이 있는데요. 이러한 설정들을 최적화해서 적은 메모리로 가능하는한 최고의 성능을 낼 수 있는 옵션이 무엇이 있는지 살펴 보겠습니다.

이는 가능하면 디스크 대신 빠른 메모리 영역에서 작업을 처리할 수 있도록 설정을 유도함으로써 CPU 성능과 조화를 이루어 전체 성능을 높일 수 있습니다.

3.1. innodb_buffer_pool_size

이 설정은 데이카베이스가 얼마만큼의 메모리를 가져다 쓸 것이냐를 지정하는 것으로 가장 중요한 설정 중의 하나입니다.

설치 시 기본으로 세팅되어 있는 값은 128k인데요. 많은 문헌에서 시스템 메모리의 65%~75% 권장하고 있습니다.

  • 일반적으로 5~6GB (8GB RAM)
  • 20~25GB (32GB RAM)
  • 100~120GB(128GB RAM)

Vultr에서 사용하는 5$ 플랜은 기껏 1GB 시스템 메모리를 가지고 있으므로 750MB를 할당하였습니다.

innodb_buffer_pool_size= 750M

3.2. innodb_log_file_size

innodb_log_file_size는 데이타베이스 충돌 발생 시 다시 실행하거나 이전으로 되돌릴 때 사용하는 메모리이빈다.

이 사이즈는 기본으로 48M이 할당되어 있는데요. 일반적으로 앞서 설정한 innodb_buffer_pool_size의 25% ~ 50% 정도 할당하는 게 좋다고 합니다. 다만 너무 클 필요는 없다는 지적이 있네요.

innodb_buffer_pool_size= 185MB

3.3. innodb_flush_log_at_trx_commit

이는 데이타베이스가 작동을 어떤 방식으로 기록하느냐를 설정하는 것이죠.

설정값은 1, 2, 0의 세가지가 있는데 기본은 1로 설정되어 있습니다.

1로 설정되면 트랜잭션을 수행할때마다 버퍼가 로그 파일에 기록되고 로그 파일은 다시 디스크로 플러시 됩니다.

2로 설정되면 데이타베이스가 각 트랜잭션을 완료 시 로그 파일에 기록되고 로그 파일은 1초마다 디스크로 플러시 됩니다.

0으로 설정되면 각 트랜젝션 시 아무런 기록을 하지 않고 로그 버퍼는 로그 파일에 기록되어 1초마다 디스크로 플러시 됩니다.

가장 성능이 좋은 것은 0을 선택하는 것이고, 1을 선택하면 가장 높은 신뢰성을 보여 준다고 합니다.

정전 등에 대비가 잘 되어 있다면 성능을 중요시해 0을 선택할 수도 있는데요. 저는 성능 지상주의이므로 0을 선택했습니다.

3.4. query_cache_size

query_cache_size는 SQL 실행 결과를 미리 특정 공간에 저장해 놓고, 다음 번 같은 문장으로 호출 시 빠르게 해당 결과를 보여주는 것인데요.

query_cache_size가 너무 크다면 갑자기 엄청난 쓰기 작업이 발생하면 서버는 바로 쿼리 작업을 하는 대신 cache를 찾아 작동하는데 집중해 오히려 속도가 느려집니다.
query_cache 때문에 발생하는 병목 현상은 자주 나타나는 현상으로 아주 악명이 높다고 알려졌는데요. query_cache_size는 너무 크지 않게 설정하는 게 좋으며 최고 512M이면 충분하다는 의견입니다.

또 어떤 가이드는 차라리 query_cache_size를 0으로 놓는 것을 고려하라고 충고하고 있습니다.

3.5. Disable MySQL DNS Lookups

DNS lookups 호스트 네임과 IP를 매번 확인후 작동하므로 느려질 수 있다고 합니다. 따라서 skip-name-resolve 명령어를 추가해서 이를 방지합니다.

skip-name-resolve

3.6. innodb_io_capacity

SSD와 같은 성능 좋은 Disk를 사용하고 있다면 이를 크게 올려주는 게 성능에 좋다고 합니다.
Vultr는 모두 SSD로 운영되므로 nnodb_io_capacity를 105000 이상으로 설정했습니다.

innodb_io_capacity = 15000

3.7. tmpdir

데이타베이스 서버에서 작동하는 많은 수의 쿼리를 디스크에서 메모리로 MySQL 임시 디렉통리를 변경하면 획기적으로 속도를 개선 가능합니다.

로드가 느린 쿼리가 포함된 일반적으로 최적화되지 않은 워드프레스 데이타베이스인 경우 이 설정은 큰 성능 개선이 가능하다고 하는데요.
이를 위해서 는 tmpdir을 램디스크인 tmpfs 디렉토리로 설정하면 성능을 개선할 수 있습니다.

램디스크인 tmpfs 위치가 어디인지를 확인하려면 df -h 명령어를 사용합니다.
일반적으로 linux의 fstab 파일에는 tmpfs가 /dev/shm가 기본으로 지정되어 있습니다.

# df -h

Filesystem      Size  Used Avail Use% Mounted on
udev            469M     0  469M   0% /dev
tmpfs            99M   11M   89M  11% /run
/dev/vda1        25G   16G  7.8G  67% /
tmpfs           495M     0  495M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           495M     0  495M   0% /sys/fs/cgroup
tmpfs            99M     0   99M   0% /run/user/0

우리는 TMPDIR을 램디스크에 위치시키도록 만들고자 합니다. 이를 위해서는 기존에 만들어진 램디스크인 tmpfs 디렉토리를 활용하는 방법과 새롭게 램디스크를 만드는 방법이 있습니다.

아래 글을 참조해 보시죠.

[워드프레스 최적화] 데이타베이스를 램디스크에서 작동시켜 속도 개선 방법

여기에선 새롭게 램디스크를 만드는 방법에 대해서 간략 살펴보겠습니다.

먼저 /dev/shm 아래에 /dev/shm/mysql 디렉토리를 만듭니다.

mkdir -p /dev/shm/mysql

이 디렉토리의 owner와 group을 mysql로 변경

chown mysql:mysql /dev/shm/mysql

my.cnf에서 tmpdir을 지정

tmpdir=/dev/shm/mysql

MySql id 찾기

이 램디스크가 리부팅해도 계속 존재하려면 fstab에 등록을 해야하죠. 그러기 위해서 먼저 MySql id를 찾습니다.

아래 명령를 사용하면 uid 및 gid 값을 알 수 있습니다.

id mysql
uid=114(mysql) gid=116(mysql) groups=116(mysql)

fstab 파일 편집

편집기를 통해서 fstab 파일을 편집 상태로 만들어 램디스크를 등록합니다.
여기에서 여기서는 위에서 검색했던 uid와 gid 정보를 활용합니다.
nano /etc/fstab
tmpfs /dev/shm/mysql tmpfs rw,gid=116,uid=114,size=768M,nr_inodes=50k,mode=0700 0 0

램디스크 마운트

이렇게 만들어진 램디스크를 마운트 합니다.
그 전에 nginx를 재부팅합니다.

service nginx restart
mount -a

4. 시스템 적용하기

위와 같이 데이타베이스 최적화 옵션을 반영했다면 마지막으로 MySQL 등을 다시 시작합니다. 그러면 위 설정들이 반영되게 됩니다.

service mysql restart
service php7.2-fpm restart
service nginx restart

그러면 제대로 반영되고 있는지 확인해 볼까요?

먼저 MariaDB로 접속합니다. 패스워드를 치고 들어갑니다.

@happist:~# mysql -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g. 이하 생략
~

다음으로는  SHOW VARIABLES LIKE 'tmpdir'; 명령으로 tempdir을 출역토록 합니다.

~~~javascript
MariaDB [(none)]> SHOW VARIABLES LIKE 'tmpdir';
+---------------+----------------+
| Variable_name | Value          |
+---------------+----------------+
| tmpdir        | /dev/shm/mysql |
+---------------+----------------+
1 row in set (0.02 sec)

음 , 정상적으로 tmpdir은 설정한대로 /dev/shm/mysql에 위치하고 있음을 알 수 있습니다.

10$ 제휴 프로모션으로 Vultr 가입하기

5. 관련 포스팅

사이트 운영을 위한 안내 – 웹서버 세팅에서 워드프레스 설치까지(우분투 17.10, NGINX 1.13.6, Marian DB 10.2, PHP7.2)

Vultr 가상서버호스팅(VPS) 서버 성능은 어느 정도일까? 기대 이상의 성능을 보여주다.

Subscribe
Notify of
guest
6 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
키리모찌

안녕하세요 ^_^
항상 포스팅 잘 보고 있습니다!
근데 tmpdir을 램디스크 즉 /dev/shm/mysql을 만들어놓고 서버를 재시작 (reboot) 하면 항상 디렉토리가 삭제되어 있네요 ㅠㅠ
어떻게 하면 재부팅해도 계속 유지되게 할수 있을까요?

Happist

안녕하세요?

그동안 개인적인 일과 회사 업무로 정신이 없어서 사이트 운영도 거의 방치된 상태였네요..

이제 정신을 차리고 하나씩 하나씩 복구해보려고 합니다.

음 저의 경우는 별 문제가 없는데요. 확인하고 다시 말씀드리겠습니다.

키리모찌

감사합니다!

Happist

안녕하세요?

출근하느라 간단히 정리해 봅니다.
자꾸 폴더가 사라진다면 기존에 이미 있는 tmpfs 폴더를 이용해도 되는데요.

df -h 명령을 사용해서 나오는 tmpfs 폴더 중 하나를 사용하용하는 방법도 좋을 것 같습니다. 이 폴더는 없어지지는 않을 것이고, 이 방법을 추천하기도 합니다.

저는 /dec/shm으로 테스트를 해보겠습니다.

1. MySql에게 이 폴더를 사용하라고 알려줍니다.
chmod 1777 /dev/shm

2. my.cnf 파일을 편집해 tmpdir을 아래처럼 바꿉니다.
tmpdir = /dev/shm

3. MySql을 다시 시작합니다.
service mysqld restart

그리고 폴더가 자꾸 사라지는이유는 폴더를 fstab에서 등록해줘야 하는데요. 이게 빠진 것 같습니다. 이 과정을 추가로 더 설명해야하지 않을까 싶네요.

1.MySql id 찾기 – id mysql을 명령어를 이용해
id mysql

그러면 uid=114(mysql) gid=116(mysql) groups=116(mysql) 와 같은 형식의 정보가 출력됩니다. 이를 기록해 놓습니다.

2. fstab 파일 편집합니다.
nano /etc/fstab

2. fstab에서 Ram Disk 등록합니다. – 할당 용량등은 임의로.. 여기서는 위에서 검색했던 uid와 gid 정보를 활용합니다.

tmpfs /dev/shm/mysql tmpfs rw,gid=116,uid=114,size=768M,nr_inodes=50k,mode=0700 0 0

3. Ram Disk 만들기 – 이미 이미 했을 듯
mkdir /dev/shm/mysql

4. 권한부여
chown mysql:mysql /dev/shm/mysql

5. 램디스크를 마운트합니다.
service nginx restart
mount -a

6. df -h로 확인

[…] 워드프레스 성능을 최적화하는 방법으로 “데이타베이스(MariaDB) 최적화 방법”을 소개한 적이 […]