taeho's life logger

저용량 메모리 환경에서 mysql 튜닝기 (My Book Live 3TB - MySQL 환경) 본문

Web/DB/Dev

저용량 메모리 환경에서 mysql 튜닝기 (My Book Live 3TB - MySQL 환경)

taeho Tae-Ho 2015.03.15 15:32

디지털 IT 기기들이 생활 속 깊이 파고들면서 옛날 같으면 종이 문서와 사진으로 남겨질 수 많은 일상의 흔적들이 디지털 정보로 노트북이나 컴퓨터 혹은 외장하드에 쌓여가고 있다. 하지만 이렇게 남겨진 디지털 정보들은 언제든지 순간의 실수 혹은 저장 기기들의 고장으로 사라져버리기 쉬운 것도 사실이다. 


My Book Live 3TB (이하 MBL)

그래서 구입한 것이 3 Tera Byte 저장 공간을 갖고 있는 NAS 장비인 My Book Live다.



MBL을 구입한 뒤 제일 먼저 한 것은 MySQL DB를 설치한 일이다. 그리고 그누보드를 설치해 게시판까지 쓸 수 있도록 했다. 그런데 문제가 발생했다. 워낙 CPU가 저-사양이니 속도가 느린 것은 이해하겠지만 수시로 메모리 부족으로 웹서버가 Hang 되는 현상이 발생했다.


이 MBL의 CPU와 메모리는 다음과 같은 사양을 갖고 있다.



문제가 되는 것은 Memory다. 그나마 128MB가 아닌 것이 다행일 지경이다.

웹서버인 Apache가 동작을 거부(?)하는 상황에서 CPU와 RAM 상태를 보면 다음과 같다.



Memory 여유분이 12480KByte이고 Swap을 440832KByte(440M)나 사용한다. 램이 256인데 440을 쓰다니.. -.- 어떤 상황인지 통 알 수가 없다. 하지만 256 MByte의 대부분을 Apache와 Mysql이 사용하는 것은 자명하다. 위 화면에는 표시되지 않았지만 mysql이 메모리를 왕창차지하고 일하기를 거부하고 있었다.


그래서 Mysql을 튜닝해보기로 했다.


저용량 메모리 환경에서 MySQL 튜닝 - my.cnf

관계형 DBMS의 하나인 Mysql은 여타 DBMS들과 마찬가지로 많은 메모리를 사용한다. 하지만 MySQL의 전통적인 관계형 DB엔진인 myisam의 경우 튜닝여부에 따라 저용량 메모리(RAM)를 가진 기기에서도 구동이 가능하다. 이는 MyISAM 엔진이 page level locking과 row level locking을 지원하지 않고 Table Level Locking만을 지원하고 Transaction 개념을 지원하지 않기 때문이다. Transaction 개념을 지원하지 않는다는 것은 commit과 rollback 등을 사용할 수 없다는 것을 의미한다. (MyISAM 이후에 지원하는 InnoDB 엔진은 이 개념들을 모두 지원한다.)


하지만...


그런 여러 고급 기술들을 지원하지 않기 때문에 작은 메모리를 가진 NAS 기기에서도 구동이 가능한 장점(?)을 갖게 됩니다.


MySQL을 튜닝하기 위해서는 /etc/mysql/my.cnf 파일의 내용을 이해해야 한다. (위치는 설치 환경에 따라 다를 수 있다.)

하지만... 그 개념들을 하나씩..하나씩 이해하면서 튜닝하기에는 시간도 노력도 투자하기가 쉽지 않다. 그렇다면?? 이미 남들이 만들어 놓은 my.cnf에서 필요한 항목을 따다~~쓰면 된다.


우리나라의 검색엔진인 Naver나 Daum에서는 그런 정보들을 찾기 쉽지 않지만 Google 에서는 그러한 정보를 찾을 수 있었다. 역시..구글..!!


그리하여 찾은 my.cnf의 내용은 다음과 같다. MySQL 파일의 내용 중 아래에서 진하게 표시된 부분만 덮어 쓰면 된다.


[mysqld]

#

# * Basic Settings

#

user            = mysql

pid-file        = /var/run/mysqld/mysqld.pid

socket          = /var/run/mysqld/mysqld.sock

port            = 3306

basedir         = /usr

datadir         = /var/lib/mysql

tmpdir          = /tmp

language        = /usr/share/mysql/english

skip-external-locking

#

# Instead of skip-networking the default is now to listen only on

# localhost which is more compatible and is not less secure.

bind-address            = 127.0.0.1

#

# * Fine Tuning

key_buffer_size         = 16M

max_allowed_packet      = 1M

table_open_cache        = 64

sort_buffer_size        = 512K

net_buffer_length       = 8K

read_buffer_size        = 256K

read_rnd_buffer_size    = 512K

myisam_sort_buffer_size = 8M


#if no other servers are going to be connecting to this server, uncomment the following line

#bind-address            = 127.0.0.1


skip-innodb

default-storage-engine = MyISAM


max-connections = 25


query-cache-size  = 2M

query-cache-limit = 1M


thread-stack      = 256K

thread-cache-size = 2M


slow-query-log

long_query_time   = 5


[mysqldump]

quick

max_allowed_packet = 16M


[mysql]

no-auto-rehash


[myisamchk]

key_buffer_size  = 20M

sort_buffer_size = 20M


일부 내용은 수정되기 전과 동일한 값이 설정되어 있을 수 있다.


이렇게 설정한 뒤 MySQL을 재구동하거나 리부팅하면 된다.


이 값을 설정한 뒤 또 문제가 생기면 일부 값들을 다시 튜닝해보려 했으나... 3일 째 문제 발생 없이 잘 돌고 있다.



Memory는 게시판에 업로드 하거나 하면 90% 이상으로 사용량이 증가하지만 Swap을 사용하지는 않는다. Swap을 사용하기 시작하면 기기의 성능은 급격하게 떨어지기 시작한다.


신고
6 Comments
댓글쓰기 폼