콘텐츠로 이동

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