Skip to the content.

Huge Page

HugePage 내용


구성 방법

  1. 적정한 HugePage 값 계산
     # (InnoDB Buffer 사이즈 + 10% 여유) / HugePage 사이즈
     SELECT (@@INNODB_BUFFER_POOL_SIZE + (@@INNODB_BUFFER_POOL_SIZE * 0.1 )) / 1024 / 1024 / 2 AS "Recommended setting: vm.nr_hugepages";
     /*
     +--------------------------------------+
     | Recommended setting: vm.nr_hugepages |
     +--------------------------------------+
     |                                  XXX |
     +--------------------------------------+
     */
    
  2. 계산한 값으로 HugePages 변경 및 커널 파라미터 변경
     sysctl -w vm.nr_hugepages=XXX
     sysctl -w vm.swappiness=1
    
     # mysql gid 값 확인
     cat /etc/group | grep mysql
     #mysql:x:XX:
    
     # 확인된 gid 값으로 해당 파라미터 설정
     sysctl -w vm.hugetlb_shm_group=XX
    
     # 재기동 이후에도 적용될 수 있도록 함
     vi /etc/sysctl.conf
    
     # 추가할 내용
     vm.nr_hugepages=XXX
     vm.swappiness=1
     vm.hugetlb_shm_group=XX
    
  3. memlock 변경
     vi /etc/security/limits.conf
    
     # 추가할 내용
     mysql soft memlock unlimited
     mysql hard memlock unlimited
    
  4. THP 비활성화

  5. MySQL 설정 변경
     vi /etc/my.cnf
    
     # 추가할 내용 ([mysqld])
     large-pages
    
  6. 변경한 커널 파라미터 적용 및 MySQL 재기동
     # 변경한 커널 파라미터 적용
     sysctl -p
    
     # HugePage 사용 현황 확인
     cat /proc/meminfo | grep -i huge
    
     # MySQL 재기동
     service mysqld restart
    
  7. MySQL에서 사용하고 있는 HugePages 수 확인
     # pl 파일 생성
     vi usedhugepages.pl
    
     # 추가할 내용
     sub UsedHugePages {
         my $pid=$_[0];
         open (NUMAMAPS, "/proc/$pid/numa_maps") || die "can't open numa_maps";
         my $HUGEPAGECOUNT=0;
    
         while (<NUMAMAPS>) {
             if (/huge.*dirty=(\d+)/) {
                 $HUGEPAGECOUNT+=$1;
             }
         }
    
         close NUMAMAPS;
    
         return ($HUGEPAGECOUNT);
     }
    
     printf "%d huge pages\n", UsedHugePages($ARGV[0]);
    
     # mysql pid
     ps -ef | grep mysql | grep -v root
    
     # pl 파일 샐행
     perl usedhugepages.pl mysql_pid
     #XXX huge pages