#mysql DB에서 swap 메모리를 쓴다는 것은?
innodb buffer pool에 할당된 메모리를 다쓰고 메모리가 부족할 때 일시적으로 swap 메모리(disk)를 사용한다.
#리눅스에서 swap 메모리설정
vi /etc/sysctl.conf
---------------------------------------------------
## swap setting
vm.swappiness=0
vm.swappiness=0 으로 하면 스왑메모리를 사용하지 않겠다는 것이지만 실제로 0으로 설정해도 mysql DB는 최소한의 스왑메모리를 사용한다. 메모리가 부족하면 DB가 죽을 수 있으므로 swappiness에 0으로 할당되어있다 하더라도 DB OS 자체를 보호하기위해 최소한의 swap 메모리를 사용하는 것으로 보인다.
#Swap 메모리 초기화 방법
리눅스에서 swap 메모리를 초기화하는 것은 아주 간단하다.
일시적 메모리 사용의 증가로 swap을 사용하게될 경우 메모리에 여유가 생겨도 swap 메모리는 자동으로 초기화되지 않는다. 이것을 수동으로 초기화하려면 아래의 명령을 입력하면 된다. 당연히 root 권한에서 실행해야 한다.
swapoff -a && swapon -a
swapoff 처리에 시간이 조금 오래 걸릴 수 있는데 서버가 멈춘 것은 아니므로 걱정하지 않아도 된다.
swap 메모리에서 필요한 부분을 물리 메모리로 옮기는 처리중인 것이다.
#실제 초기화 작업
개발DB는 32G로 되어있고 mysql 인스턴스가 2개 떠있다.
개발장비가 부족하여 어쩔수 없이 멀티 인스턴스로 띄워놓았고, 각각 innodb_buffer_pool 은 16G 할당해놓았다.
당연히 50~80%가 MAX인데 그 이상(100%)을 설정해놓았으니 스왑메모리를 사용하였고 요즘 들어 너무 느려서 스왑메모리 사용을 초기화하고 관련 내용을 정리한다.
[root@admin]# free -m
total used free shared buffers cached
Mem: 32079 28264 3815 1 392 6806
-/+ buffers/cache: 21065 11014
Swap: 15999 5048 10951
//스왑메모리를 5G정도 사용하고 있다.
[root@admin]# swapoff -a && swapon -a
swapoff: /dev/sda3: swapoff failed: 메모리를 할당할 수 없습니다
DB가 메모리를 쓰고 있어서 남는 메모리가 없어 메모리 할당을 할수 없다는 메시지다.
DB 인스턴스 하나를 죽이고 버퍼캐시를 초기화해서 메모리를 비운다.
service mysqld_multi stop 1 --password=xxxxxxxx
echo 3 > /proc/sys/vm/drop_caches
[root@admin]# swapoff -a && swapon -a
//오 된다~
#top 확인
top - 18:30:39 up 564 days, 2:46, 2 users, load average: 2.28, 1.89, 1.48
Tasks: 618 total, 2 running, 616 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 4.1%sy, 0.0%ni, 95.8%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 32849832k total, 21902092k used, 10947740k free, 8956k buffers
Swap: 4177092k total, 4177092k used, 0k free, 78480k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
30537 root 20 0 102m 628 544 D 91.6 0.0 5:12.30 swapoff
5525 root 20 0 0 0 0 S 1.0 0.0 80:24.23 kondemand/3
5528 root 20 0 0 0 0 S 1.0 0.0 195:01.54 kondemand/6
15 root RT 0 0 0 0 S 0.7 0.0 0:20.01 migration/3
5540 root 20 0 0 0 0 S 0.7 0.0 195:24.81 kondemand/18
//음 뭔가 작업을 하고 있다. 프로세스는 100%까지 쓰는 것으로 보아 cpu는 1core를 사용하는 것을 알 수 있다.
//나머지 DB인스턴스에 영향을 미칠정도는 아닌 것을 알 수 있다.
#메모리 확인
...
[root@admin]$ free -m
total used free shared buffers cached
Mem: 32079 22070 10009 1 12 117
-/+ buffers/cache: 21940 10139
Swap: 3030 3030 0
[root@admin]$ free -m
total used free shared buffers cached
Mem: 32079 22089 9990 1 12 117
-/+ buffers/cache: 21959 10120
Swap: 3000 3000 0
[root@admin]$ free -m
total used free shared buffers cached
Mem: 32079 22091 9987 1 12 117
-/+ buffers/cache: 21962 10117
Swap: 2998 2998 0
[root@admin]$ free -m
total used free shared buffers cached
Mem: 32079 22093 9985 1 12 116
-/+ buffers/cache: 21964 10115
Swap: 2997 2997 0
[root@admin]$ free -m
total used free shared buffers cached
Mem: 32079 22228 9851 1 13 124
-/+ buffers/cache: 22090 9989
Swap: 2803 2803 0
// 5047M에서 swap메모리 사용을 계속 줄여서 0에 수렴하게 만든 후 다시 스왑메모리를 사용하도록 할당하는 작업을 하고 있다.
//근데 이게 생각보다 많이 느리다. SATA2에 5G정도사용했는데.. 30분이상 걸리고 있다.
...
..
.
[root@admin]$ free -m
total used free shared buffers cached
Mem: 32079 28125 3953 1 165 3658
-/+ buffers/cache: 24301 7778
Swap: 15999 0 15999
//완료된 후에 위처럼 스왑메모리가 초기화 되었고 free가 15999(16G)로 초기화 되어 있는 것을 알 수 있다.
다시 DB 인스턴스를 띄운다.
service mysqld_multi start 1
기분탓인가? 툴에서 쿼리 반응속도가 아까보단 좀 낫다.
장비하나 사주면 좋을텐데.. innodb 버퍼풀을 줄이고 싶지만 조인 20개이상 걸린 해비 쿼리가 많아서 줄이면
성능테스트를 할 수가 없다..;
당분간 이걸로 버텨야할 듯하다.
끝~
'RDB > mysql' 카테고리의 다른 글
mysql을 시작하기 전에 2 (0) | 2020.08.11 |
---|---|
mysql을 시작하기 전에 1 (0) | 2020.08.04 |
대용량 테이블 컬럼추가 (rows 1000만 건 이상) (0) | 2020.07.17 |
mysql order by 정렬 빼도 될까? 2 (0) | 2020.06.26 |
mysql order by 정렬 빼도 될까? 1 (0) | 2020.06.19 |