x86_64 시스템에서 4MB 크기 HugePageSize 변경 불가.
HugePage 는 Linux 의 기본 메모리 페이지 크기인 4K(4096) 가 아닌 더 큰 페이지를 사용하도록함으로서 잦은 메모리 액세스를 줄여 자원 소모를 줄이게 해준다.
최신의 Linux 는 전부 이것을 지원하며 다음과 같이 확인 할 수 있다.
1 2 3 4 5 6 7 8 |
[orion@localhost ~]$ grep Huge /proc/meminfo AnonHugePages: 96256 kB ShmemHugePages: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB |
기본 메모리 페이지는 Hugepagesize 인 2MB(2048kb) 임을 확인할 수 있다.
그런데, 이 메모리 페이지 크기를 바꿀 수 있지 않을까? 결론부터 말하면 불가능하다.
이 Hugepagesize 는 CPU 지원에 의존한다.
- 2MB – cpu에 ‘pse’ 가 지원되면 된다.
- 1G – cpu 가 ‘pdpe1gb’ 가 지원되면 된다.
최신의 CPU 는 위 두가지 ‘pse’, ‘pdpe1gb’ 를 모두 지원한다. 1GB 의 메모리 페이지를 지원한다. 하지만 4MB 의 메모리 페이지를 지원하지 않는다. 그렇다면 왜 이 글을 쓰는가? 이유는 MySQL 문서 때문이다.
shell> cat /proc/meminfo | grep -i huge
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 4096 kBhttps://dev.mysql.com/doc/refman/5.7/en/large-page-support.html
MySQL 문서를 보면 위와 같이 4096Kb 라고 나온다. 하지만 x86_64 시스템에서는 절대로 4096kb 가 될수가 없다. 2MB 아니면 1GB 만 가능하다.
혹시나 해서 이것을 바꾸기 위해서 다음과 같이 부팅 파라메터를 주고 재부팅을 해뒀다.
1 2 |
root@ubuntu:/opt/sysbench/bin# cat /proc/cmdline BOOT_IMAGE=/boot/vmlinuz-4.10.0-19-generic root=UUID=b434e26a-280e-4c48-b8c0-9e3322bac299 ro net.ifnames=0 biosdevname=0 transparent_hugepage=never hugepagesz=4194304 default_hugepagesz=4194304 |
하지만 부팅 메시지에 다음과 같이 나온다.
1 2 |
[ 0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-4.10.0-19-generic root=UUID=b434e26a-280e-4c48-b8c0-9e3322bac299 ro net.ifnames=0 biosdevname=0 transparent_hugepage=never hugepagesz=4194304 default_hugepagesz=4194304 [ 0.000000] hugepagesz: Unsupported page size 4 M |
지원하지 않는다는 메시지를 보여준다.
결론은 Hugepagesize 는 CPU 에서 지원해줘야 하는 것이며 최신의 x86_64 의 경우 2MB, 1GB 두가지만 지원한다.