MySQL 8.0 의 메모리 소 모 를 상세 하 게 분석 하 다.

MySQL 8.0 이 시 작 될 때 다양한 buffer 와 cache 를 설정 하여 데이터베이스 의 성능 을 향상 시 킵 니 다.만약 우리 가 한 서버 에 MySQL 8.0 의 서 비 스 를 설정 했다 면,이 서버 의 메모 리 는 동시에 운영 체제,MySQL 8.0 서비스,그리고 다른 응용 프로그램 에 의 해 공 유 될 것 이다.
   생산 환경 에서 메모리 의 경 고 를 자주 만 날 수 있 습 니 다.이런 경 고 를 처리 하기 전에 MySQL 자체 가 메모리 소 모 를 가장 많이 하 는 점 이 어디 에 있 는 지 알 아야 MySQL 서비스 가 사용 하 는 메모리 가 얼마나 되 는 지,그리고 MySQL 자체 의 메모리 소 모 를 어떻게 낮 추 는 지 직관 적 으로 판단 할 수 있 습 니 다.
   MySQL 프로필 에서 가장 많이 사용 되 는 두 개의 메모리 관련 인 자 는 innodb 입 니 다.buffer_pool_size、innodb_log_buffer_size,이 두 개의 인 자 를 봅 시다.
1、innodb_buffer_pool_size
이 매개 변 수 는 buffer pool 의 크기 를 정의 합 니 다.모두 가 잘 알 고 있 을 것 입 니 다.buffer pool 의 내용 은 innodb 표,색인,그리고 다른 보조 buffer 를 포함 합 니 다.buffer pool 의 크기 는 MySQL 시스템 성능 에 큰 영향 을 미 칩 니 다.기본 적 인 상황 에서 MySQL 8.0 에서 설정 한 buffer pool 크기 는 128 MB 입 니 다.일반적인 상황 에서 단일 인 스 턴 스 라면 다른 업무 가 없습니다.그러면 MySQL 은 공식 적 으로 시스템 메모리 의 50%에서 75%사이 로 설정 하 는 것 을 권장 합 니 다.물론 서버 에 다른 프로그램 이 배치 되 어 있다 면 이 비율 을 줄 여 메모 리 를 비 워 야 합 니 다.
운영 체제 의 메모리 가 충분 하 다 면 여러 개의 innodb buffer pool 인 스 턴 스 를 설정 할 수 있 습 니 다.다음 매개 변 수 를 사용 하여 이 인 스 턴 스 의 개 수 를 조정 할 수 있 습 니 다.

mysql> show variables like '%innodb_buffer_pool_instances%';
+------------------------------+-------+
| Variable_name    | Value |
+------------------------------+-------+
| innodb_buffer_pool_instances | 1  |
+------------------------------+-------+
1 row in set (0.00 sec)
2、innodb_log_buffer_size
이 매개 변 수 는 innodb 메모리 엔진 이 디스크 에 redo log 를 쓰기 전에 최대 메모리 에 데 이 터 를 캐 시 하 는 크기 를 정의 합 니 다.기본 값 은 16MB 입 니 다.이 값 이 증가 하면 큰 사 무 는 사 무 를 제출 하기 전에 redo log 를 떨 어 뜨리 지 않 아 도 됩 니 다.update,delete,insert 작업 이 줄 수 에 영향 을 많이 미친다 면 이 값 을 늘 리 는 것 을 고려 해 야 합 니 다.
포인트 가 왔 습 니 다.
운영 체제 에서 MySQL 이 사용 하 는 메모 리 는 상기 두 개의 메모리 설정 매개 변수 와 관련 이 있 을 뿐만 아니 라 일반적인 상황 에서 MySQL 이 사용 하 는 메모 리 를 계산 할 때 다음 네 개의 값 을 추가 하 는 방식 을 사용 합 니 다.
1、innodb_buffer_pool_size
2、key_buffer_size  (이 매개 변 수 는 보통 my isam 표 가 메모 리 를 차지 하 는 관건 적 인 매개 변수 입 니 다)
3、max_connections*(sort_buffer_size+read_buffer_size+binlog_cache_size)(이 세 개 는 연결 단계 의 buffer)
4、max_connections*2MB
그래서 top 명령 을 사용 하면 MySQL 이 사용 하 는 메모리 가 innodb 보다 훨씬 많 습 니 다.buffer_pool_size 를 고려 해 야 할 또 다른 관건 적 인 요 소 는 연결 수가 기준 치 를 초과 하 는 지 여부 입 니 다.연결 수가 너무 높 으 면 상기 3,4 두 부분 에 소모 되 는 메모리 가 매우 많 을 것 입 니 다.
물론 위 에 열거 한 것 은 MySQL 의 가장 주요 한 메모리 사용 요소 입 니 다.그 밖 에 다른 메모리 가 소모 되 는 곳 은 공식 문 서 를 볼 수 있 습 니 다.
https://dev.mysql.com/doc/refman/8.0/en/memory-use.html
위 문서 에는 performance 를 어떻게 사용 하 는 지 소개 합 니 다.schema 는 MySQL 의 메모리 사용 을 감시 합 니 다.여기 서 전체 절차,상세 한 세부 사항 과 매개 변수 소 개 는 공식 문 서 를 참조 하 십시오.
1.보기
performance_schema.setup_instruments
이 표 는 관심 있 는 메모리 변수의 이름 을 찾 습 니 다.예 를 들 어 저 희 는 memory/innodb 관련 매개 변 수 를 검색 합 니 다.innodb 메모리 엔진 이 사용 하 는 메모 리 를 대표 합 니 다.결 과 는 다음 과 같 습 니 다.

mysql> SELECT * FROM performance_schema.setup_instruments  WHERE NAME LIKE '%memory/innodb%';
+-------------------------------------------+---------+-------+-------------------+------------+---------------+
| NAME          | ENABLED | TIMED | PROPERTIES  | VOLATILITY | DOCUMENTATION |
+-------------------------------------------+---------+-------+-------------------+------------+---------------+
| memory/innodb/adaptive hash index   | YES  | NULL |     |   0 | NULL   |
| memory/innodb/log and page archiver  | YES  | NULL |     |   0 | NULL   |
| memory/innodb/buf_buf_pool    | YES  | NULL | global_statistics |   0 | NULL   |
| memory/innodb/buf_stat_per_index_t  | YES  | NULL |     |   0 | NULL   |
| memory/innodb/clone      | YES  | NULL |     |   0 | NULL   |
| memory/innodb/dict_stats_bg_recalc_pool_t | YES  | NULL |     |   0 | NULL   |
| memory/innodb/dict_stats_index_map_t  | YES  | NULL |     |   0 | NULL   |
| memory/innodb/dict_stats_n_diff_on_level | YES  | NULL |     |   0 | NULL   |
| memory/innodb/other      | YES  | NULL |     |   0 | NULL   |
| memory/innodb/partitioning    | YES  | NULL |     |   0 | NULL   |
| memory/innodb/row_log_buf     | YES  | NULL |     |   0 | NULL   |
| memory/innodb/row_merge_sort    | YES  | NULL |     |   0 | NULL   |
| memory/innodb/std       | YES  | NULL |     |   0 | NULL   |
| memory/innodb/trx_sys_t::rw_trx_ids  | YES  | NULL |     |   0 | NULL   |
| memory/innodb/undo::Tablespaces   | YES  | NULL |     |   0 | NULL   |
| memory/innodb/ut_lock_free_hash_t   | YES  | NULL |     |   0 | NULL   |
| memory/innodb/api0api      | YES  | NULL |     |   0 | NULL   |
| memory/innodb/api0misc     | YES  | NULL |     |   0 | NULL   |
| memory/innodb/btr0btr      | YES  | NULL |     |   0 | NULL   |
2.설정 파일 에 관련 매개 변 수 를 쓰 고 통 계 를 열 어 memory/innodb/rowlog_buf 의 경우 설정 파일 이 다음 과 같이 수정 되 었 습 니 다.

performance-schema-instrument='memory/innodb/row_log_buf=COUNTED'
3.인 스 턴 스 를 시작 하고 performanceschema 데이터베이스 memorysummary_global_by_event_name 표 에서 메모리 통계 결 과 를 봅 니 다.

SELECT * FROM performance_schema.memory_summary_global_by_event_name WHERE EVENT_NAME LIKE 'memory/innodb/row_log_buf'\G
물론 sys 표 의 결과 에 따라 각 유형의 집합 결 과 를 볼 수 있 습 니 다.다음 과 같 습 니 다.

mysql> SELECT SUBSTRING_INDEX(event_name,'/',2) AS
  code_area, FORMAT_BYTES(SUM(current_alloc))
  AS current_alloc
  FROM sys.x$memory_global_by_current_bytes
  GROUP BY SUBSTRING_INDEX(event_name,'/',2)
  ORDER BY SUM(current_alloc) DESC;
+---------------------------+---------------+
| code_area     | current_alloc |
+---------------------------+---------------+
| memory/innodb    | 843.24 MiB |
| memory/performance_schema | 81.29 MiB  |
| memory/mysys    | 8.20 MiB  |
| memory/sql    | 2.47 MiB  |
| memory/memory    | 174.01 KiB |
| memory/myisam    | 46.53 KiB  |
| memory/blackhole   | 512 bytes  |
| memory/federated   | 512 bytes  |
| memory/csv    | 512 bytes  |
| memory/vio    | 496 bytes  |
+---------------------------+---------------+
더 자세 한 정 보 는 공식 문 서 를 참조 하 시기 바 랍 니 다.
이상 은 MySQL 8.0 의 메모리 소 모 를 상세 하 게 분석 하 는 것 입 니 다.MySQL 8.0 메모리 소모 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

좋은 웹페이지 즐겨찾기