INNODB 버퍼 풀 통계 이해


20

mysql documentation 에서이 페이지 를 읽은 후 현재 InnoDB 사용법을 이해하려고했습니다. 현재 버퍼 풀에 6GB의 RAM을 할당합니다. 우리의 데이터베이스 크기는 거의 같습니다. 출력은 다음과 같습니다 show engine innodb status\G(v5.5를 실행 중).

----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 6593445888; in additional pool allocated 0
Dictionary memory allocated 1758417
Buffer pool size   393215
Free buffers       853
Database pages     360515
Old database pages 133060
Modified db pages  300
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 7365790, not young 23099457
0.00 youngs/s, 0.00 non-youngs/s
Pages read 1094342, created 185628, written 543182148
0.00 reads/s, 0.00 creates/s, 37.32 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 360515, unzip_LRU len: 0
I/O sum[2571]:cur[0], unzip sum[0]:cur[0]

버퍼 캐시를 얼마나 잘 활용하고 있는지 알고 싶었습니다. 처음 출력에서이기는 후, 우리가 실제로의 기반으로, 그것을 사용하고 있는지 출연 Pages made youngnot young그들의 숫자와가 Buffer pool hit rate is 1000 / 10000(나는이 수단이 꽤 많이 사용되고있는 웹에 다른 곳에서 보았다. 진정한?)

무엇 루프를 통해 저를 던지고는 이유 young-making ratenot0/1000에서 모두하고 있습니다 young/snon-young/s오른쪽 모두가 전혀 사용되지 않고 있다는 나타냅니다 액세스는 0 자에서 모두?

누구든지 이것을 이해할 수 있습니까?

답변:


18
 Buffer pool hit rate is 1000 / 1000

이것은 당신이 처한 상황에서 유일하게 의미있는 가치입니다 ... 그리고 그 상황은 완벽한 100 % 적중률을 가진 버퍼 풀을 가질만큼 운이 좋다는 것입니다. 서버 OS의 메모리가 부족하여 스와핑을 일으키지 않는 한 변경할 필요가 없으므로 나머지를 과도하게 분석하지 마십시오.

버퍼 풀에 압력이없는 경우에는 young / not young 값이 흥미롭지 않습니다. InnoDB는 그것을 사용하고 있으며, 그것 없이는 아무것도하지 않습니다. 풀이 너무 작 으면 페이지가 제거되고 새 페이지가 읽히고 다른 통계는이를 이해하는 데 도움이됩니다. 그러나 이것이 귀하가 가지고 있지 않은 문제입니다.

무료 풀에서 "사용하지 않는"공간이됩니다 결코 그것이 전혀 어떤 이유로 필요한 경우, 무시하거나 InnoDB에 의해 왼쪽 유휴 당신이 당신의 작업의 크기로 확장 숨쉴 공간이 것만 무료 수단이 있다는 사실 때문에 데이터 세트가 커집니다.

물론, 최근에 서버를 다시 시작하지 않은 경우에는 서버가 불완전합니다. 통계에서 전체 스토리를 알리기 전에 서버는 전체 "정상"사용 (전체 백업 포함) 기간 전체를 실행해야합니다. ... 시간, 일, 주, 월 또는 연도에 따라 응용 프로그램에 따라 다릅니다.


28

The Buffer pool size 393215 바이트가 아닌 페이지입니다.

버퍼 풀 크기 (GB)를 보려면 다음을 실행하십시오.

SELECT FORMAT(BufferPoolPages*PageSize/POWER(1024,3),2) BufferPoolDataGB FROM
(SELECT variable_value BufferPoolPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_total') A,
(SELECT variable_value PageSize FROM information_schema.global_status
WHERE variable_name = 'Innodb_page_size') B;

Database pages 360515 버퍼 풀에 데이터가있는 페이지 수입니다.

버퍼 풀 크기의 데이터 양 (GB)을 보려면 다음을 실행하십시오.

SELECT FORMAT(BufferPoolPages*PageSize/POWER(1024,3),2) BufferPoolDataGB FROM
(SELECT variable_value BufferPoolPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_data') A,
(SELECT variable_value PageSize FROM information_schema.global_status
WHERE variable_name = 'Innodb_page_size') B;

사용중인 버퍼 풀의 백분율을 보려면 다음을 실행하십시오.

SELECT CONCAT(FORMAT(DataPages*100.0/TotalPages,2),' %') BufferPoolDataPercentage FROM
(SELECT variable_value DataPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_data') A,
(SELECT variable_value TotalPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_total') B;

Modified db pages 300버퍼 풀에서 데이터베이스에 다시 써야하는 페이지 수입니다. 더티 페이지라고도합니다.

Dirty Pages가 차지한 공간을 보려면 다음을 실행하십시오.

SELECT FORMAT(DirtyPages*PageSize/POWER(1024,3),2) BufferPoolDirtyGB FROM
(SELECT variable_value DirtyPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_dirty') A,
(SELECT variable_value PageSize FROM information_schema.global_status
WHERE variable_name = 'Innodb_page_size') B;

더티 페이지의 백분율을 보려면 다음을 실행하십시오.

SELECT CONCAT(FORMAT(DirtyPages*100.0/TotalPages,2),' %') BufferPoolDirtyPercentage FROM
(SELECT variable_value DirtyPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_dirty') A,
(SELECT variable_value TotalPages FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_total') B;

디스플레이의 다른 것들에 관해서는 다음을 실행하십시오.

SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool%';

버퍼 풀에 대한 모든 상태 변수가 표시됩니다. 검사 할 내용에 대해 동일한 쿼리를 적용 할 수 있습니다.


고맙습니다! 이로부터 버퍼 캐시가 실제로 사용되고 있음을 알지만, 우리가 효과적으로 사용하고 있는지 알고 싶습니다. 내가 젊고 오래된 페이지의 개념을 이해한다면, 버퍼 캐시가 최대로 사용되고 있다는 좋은 지표는 젊게 만들어진 페이지 수와 어린 페이지에 액세스하는 것입니다. 맞습니까? 우리는 mysqldump를 사용하여 3 시간마다 백업을 수행하는데, 이것이 가득 찬 이유를 설명합니다. 그러나 함께 young-making rate 0 / 1000하고 0.00 youngs/s, 그것은 우리가 정말 그것을 사용하지 않는 우리에게 알려줍니다. 내가 이것을 올바르게 읽고 있습니까?
Safado

2
young-making rate 0/1000은 실행중인 쿼리에 대한 데이터 페이지 중 데이터가 모두 캐시에 적합 할뿐만 아니라 젊은 캐시의 작은 (3/8) 크기에 적합하다는 것을 나타냅니다. 즉, 쿼리가 일부 데이터를 큰 비 영구 캐시로 유지하기에 충분한 데이터를 사용하지 않습니다.
토마스 존스-1

나머지 innodb_buffer_pool 상태 변수에 대한 간단한 설명이 매우 유용합니다. 답변에
추가해 주시겠습니까?

5

"완벽한 100 % 적중률을 가진 버퍼 풀을 가질만큼 운이 좋다"는 평가에 동의하지 않습니다.

출력 상단 (잘려진 부분)에는 다음과 같은 줄이 있습니다.

Per second averages calculated from the last 16 seconds

이것은 지난 16 초 동안 읽은 것이 없으므로 (인공적으로) 완벽한 '1000/1000'점수를줍니다.

0.00 reads/s, 0.00 creates/s, 37.32 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000

그 사이에 약간의 글이있었습니다. '더티'페이지를 플러시하거나 '변경 버퍼'에서 인덱스를 정리하기 위해 쓰기가 지연되었을 수 있습니다.

아마도 지난 16 초 동안 젊음 / 뜨거운 지역에서 활동이 없었을 것입니다.


글쎄, 우리는 초당 평균 6k-10k SELECT를 수행하고 동시에 서버에서 거의 0
번의

"쿼리 캐시"가 대부분의 쿼리를 만족합니까? SHOW VARIABLES LIKE 'query%';SHOW GLOBAL STATUS LIKE 'Qc%';SHOW GLOBAL VARIABLES LIKE 'Com_SELECT';.
Rick James

0

버퍼 풀은 젊은 목록과 비영 목록의 두 부분으로 나뉩니다. 작성 비율은 두 목록 사이에서 셔플되는 버퍼 풀의 페이지 수를 표시합니다.

젊게 만들어진 페이지는 작성되지 않은 페이지입니다 (예 : 캐시에서 읽음). 젊지 않은 페이지는 페이지가 너무 오래되었거나 젊음 목록이 가득 찼기 때문에 젊음 목록에서 이동 된 페이지입니다.

두 페이지 사이의 페이지 이동 속도는 현재 사용중인 버퍼 풀의 양과 어린 풀의 크기에 따라 다릅니다. 0으로 설정하면 활성 세트 (사용중인 페이지)가 어린 풀보다 작습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.