개발용 MySQL Docker 컨테이너의 메모리 소비가 크고 힘들었기 때문에 performance_schema를 무효로 하고 얼마나 줄어든지 조사한 메모

6586 단어 MySQL도커
  • 개발시에 수중의 머신으로 컨테이너를 2개, 3개와 동시에 움직여야 하는 장면이 있어 괴롭다
  • 특히 MySQL 5.6. 취급하는 데이터가 소량이라도 400MB를 넘는다.
  • 데이터 조금 밖에 넣지 않은데? MySQL은 그런 것인데… ?

  • 저것 이것을 조사해 퍼포먼스 스키마를 무효로 하는 방법에 따라 갔다


  • 이하, 얼마나 줄어든지를 조사한 메모입니다.

    ※ 무효로 해 문제가 없는가 하는 점에 대해서는 단정을 피해(자세하지 않기 때문에), 이 기사에서는 무효로 했을 때에 얼마나 메모리 소비가 줄어든지 조사한 것에 대해서만 씁니다. 다만, 가볍게 조사한 한에서는, 장애의 조사나 퍼포먼스 튜닝을 하지 않는다면, 개발 용도에서는 무효로 해도 불편함은 없을 것 같았습니다.

    결과



    ※ 이하, "ps"라고 쓰고 있는 것은 performance_schema 의 약어입니다.

    부팅 후 메모리 사용량( docker stats 로 표시되는 값):


    MySQL 버전
    ps=ON(MiB)
    ps = OFF(MiB)


    5.6.61
    464.6
    59.8

    5.7.34
    194.3
    62.7

    8.0.24
    335.9
    118.6


    5.6.61에서는 비활성화하여 88 % 감소했습니다
    또한 5.7에서 성능 스키마의 메모리 소비가 상당히 개선되었음을 알 수 있습니다.
    show engine performance_schema status 에서 성능 스키마 전체에서 메모리 사용량을 살펴보면 다음과 같아서 위에서 줄인 양과 거의 일치했습니다.


    MySQL 버전
    performance_schema.memory (MiB)


    5.6.61
    403.9

    5.7.34
    131.3

    8.0.24
    208.4


    조사 방법



    사용한 것


  • 호스트: Ubuntu 18.04
  • MySQL의 공식 Docker 이미지
  • Sakila 샘플 데이터

  • 디렉토리 파일 배치


    - (作業用ディレクトリ)
      - sakira-db/
        - 0_sakila-schema.sql
        - 1_sakila-data.sql
      - conf.d/
        - my.cnf
    
    conf.d/sakila-db/ 를 각각 마운트하고 로드했습니다. 아래 스크립트 참조.

    conf.d/my.cnf


    [mysqld]
    
    # デフォルトでは ON
    performance_schema=OFF
    

    조사용 스크립트


    client.sh
    #!/bin/bash
    
    CONTAINER_NAME=mysql-sakila
    
    docker exec -it -e MYSQL_PWD=root $CONTAINER_NAME \
      mysql --protocol=tcp -uroot -Dsakila "$@"
    
    restart.sh
    #!/bin/bash
    
    CONTAINER_NAME=mysql-sakila
    TIMEOUT_SEC=120
    # MYSQL_VER=5.6.51
    # MYSQL_VER=5.7.34
    MYSQL_VER=8.0.24
    
    # 動いていたら止める
    if (docker ps --format "{{.Names}}" | grep '^'${CONTAINER_NAME}'$' > /dev/null); then
      docker stop $CONTAINER_NAME
    fi
    
    # mysqld 起動
    docker run --rm -it \
      -e MYSQL_ROOT_PASSWORD=root \
      -v "$(pwd)/conf.d:/etc/mysql/conf.d" \
      -v "$(pwd)/sakila-db:/docker-entrypoint-initdb.d" \
      --name $CONTAINER_NAME \
      -d \
      mysql:$MYSQL_VER
    
    # mysqld の起動完了を待って exit
    for i in $(seq $TIMEOUT_SEC); do
      if (./client.sh -e "select 1" > /dev/null 2>&1); then
        printf "\n"
        echo "ok"
        exit 0
      else
        printf "."
        sleep 1
      fi
    done
    
    echo "failed"
    exit 1
    
    ps_info.sh
    #!/bin/bash
    
    set -o xtrace
    
    ./client.sh -e "
      show variables like 'performance_schema'
    "
    
    # パフォーマンススキーマ全体でのメモリ使用量
    ./client.sh -e "
      show engine performance_schema status
    " | grep 'performance_schema.memory'
    

    참고


  • MySQL :: MySQL 8.0 참조 설명서 :: 27 MySQL 성능 스키마 (dev.mysql.com)
  • (2016) performance_schema를 sys로 쓰러 뜨리십시오! | Think IT(싱크잇)
  • (2016) t2.nano에서 MySQL5.6을 움직이기 위해 | 겐지니아 일기
  • (2016) MySQL5.6 performance_schema와 table_definition_cache 조정 | riscascape.net
  • 좋은 웹페이지 즐겨찾기