>  기사  >  데이터 베이스  >  Chat MySQL 메모리 관리, 메모리 할당자 및 운영 체제

Chat MySQL 메모리 관리, 메모리 할당자 및 운영 체제

coldplay.xixi
coldplay.xixi앞으로
2021-01-08 09:35:411889검색

Chat MySQL 메모리 관리, 메모리 할당자 및 운영 체제

권장(무료): mysql 비디오 튜토리얼

사용자가 소프트웨어(MySQL 포함)를 사용하여 메모리 문제에 직면할 때 가장 먼저 나타나는 반응은 메모리 누수입니다. 이 기사에서 알 수 있듯이 항상 그런 것은 아닙니다.

이 글에서는 메모리 관련 버그를 설명합니다.

모든 Percona 지원 고객은 버그 수정을 받을 수 있지만 옵션은 다양합니다. 예를 들어 Advanced+ 고객에게는 패치가 포함된 소프트웨어가 공개되기 전에 HotFix 빌드가 제공됩니다. Percona 소프트웨어를 사용할 필요도 없습니다. 패치를 업스트림으로 포팅할 수 있습니다. 그러나 Percona 제품의 경우 모든 지원 수준에 수정 사항이 있을 수 있습니다.

모든 Percona 지원 고객은 버그 수정을 받을 수 있습니다. 다른 옵션. 예를 들어, VIP 고객은 소프트웨어 패치가 공식적으로 출시되기 전에 핫픽스 버전을 얻을 수 있습니다. 프리미엄 고객은 Percona의 소프트웨어를 사용할 필요도 없이 패치를 업스트림으로 푸시할 수도 있습니다. 그러나 Percona 제품의 경우 모든 지원 수준에 버그 수정이 적용됩니다.

그렇다고 해서 우리가 해당 동작을 유효한 버그로 받아들인다 하더라도 이러한 결정의 이유 중 하나는 Percona 제품의 동작이 명백히 잘못되었기 때문일 수 있습니다.

그렇다고 해서 이 상황을 유효한 버그로 받아들이더라도 예상치 못한 상황을 모두 수정한다는 의미는 아닙니다. 그러한 결정을 내리는 이유 중 하나는 이러한 예상치 못한 상황이 분명히 잘못된 것이지만 실제로는 퍼코나 제품 자체에 대한 제품 요구 사항이기 때문일 수 있습니다

학습 사례로서의 버그

이러한 사례의 최근 좋은 예는 다음과 같습니다. PS-5312 – 버그는 업스트림에서 반복 가능하며 bugs.mysql.com/95065에 보고되었습니다.

최근 좋은 사례는 PS-5312입니다. 이 버그는 업스트림에서 재현되고 bugs.mysql.com에 보고될 수 있습니다. /95065.

이 보고서는 InnoDB 전체 텍스트 인덱스에 대한 액세스로 인해 메모리 사용량이 증가하는 상황을 보고합니다. 이는 누군가가 전체 텍스트 인덱스를 쿼리할 때 시작되어 최대치까지 증가하며 꽤 오랫동안 해제되지 않습니다.

이 보고서는 In에 대해 설명합니다. 이 경우 InnoDB의 전체 텍스트 인덱스에 액세스할 때 메모리 사용량이 증가합니다. 이 상황은 일부 전체 텍스트 인덱스 쿼리에서 발생합니다. 메모리는 최대값에 도달할 때까지 계속 증가하며 오랫동안 해제되지 않습니다.

페르코나 엔지니어링 팀의 유라 소로킨이 메모리 누수인지 조사한 결과 메모리 누수가 아닌 것으로 확인되었습니다.

페르코나 엔지니어링 팀의 유라 소로킨이 메모리 누수인지 조사한 결과 메모리 누수가 아닌 것으로 확인되었습니다.

InnoDB는 전체 텍스트 쿼리를 해결할 때 fts_query_phrase_search 함수에서 메모리 힙을 생성합니다. 이 힙은 최대 80MB까지 커질 수 있습니다. 또한 항상 지속적으로 사용되지 않는 많은 수의 블록( mem_block_t )이 있습니다. 메모리 조각화로 이어집니다.

InnoDB는 전체 텍스트 쿼리를 구문 분석할 때 fts_query_phrase_search 함수에 메모리 힙을 생성하며 이는 80M까지 증가할 수 있습니다. 또한 이 프로세스는 연속되지 않은 많은 블록(mem_block_t)을 사용하므로 메모리 조각화가 발생합니다. fts_query_phrase_search函数中创建一个内存堆,这个堆可能增长到80M。另外,这个过程还会使用到大量非连续块(mem_block_t)进而产生的内存碎片。

In the function exit , the memory heap is freed. InnoDB does this for each of the allocated blocks. At the end of the function, it calls free() which belongs to one of the memory allocator libraries, such as malloc or jemalloc. From the mysqld point of view, everything is done correctly: there is no memory leak.

在函数出口,这些内存堆会被释放。InnoDB会为其分配的每一个块做这个操作。在函数执行结束时,调用一个内存分配器库中的free()操作,比如malloc或者jemalloc

함수에서 메모리 힙이 해제됩니다. InnoDB는 할당된 각 블록에 대해 이 작업을 수행하며, 함수 끝에서 malloc 또는 jemalloc과 같은 메모리 할당자 라이브러리 중 하나에 속하는 free()를 호출합니다. .mysqld 관점에서 볼 때 모든 것이 올바르게 수행됩니다. 메모리 누수가 없습니다.

함수 종료 시 이러한 메모리 힙이 해제됩니다. InnoDB는 할당하는 모든 블록에 대해 이 작업을 수행합니다. 함수 실행이 끝나면 malloc 또는 jemalloc과 같은 메모리 할당자 라이브러리에서 free() 작업을 호출합니다. MySQL 자체의 관점에서 보면 이는 문제가 되지 않으며 메모리 누수도 없습니다.

그러나 free()가 호출되면 메모리를 해제해야 하지만 이를 운영 체제로 다시 반환할 필요는 없습니다. 메모리 할당자가 동일한 메모리 블록이 곧 필요할 것이라고 결정하면 mysqld 프로세스를 위해 계속 유지할 수 있습니다. . 이는 작업이 완료되고 모든 할당 해제가 완료된 후에도 mysqld가 여전히 많은 메모리를 사용하는 것을 볼 수 있는 이유를 설명합니다. 🎜🎜그러나 free() 함수는 실제로 호출될 때 메모리를 해제해야 하지만 그렇지 않습니다. 이를 운영 체제로 반환해야 합니다. 메모리 할당자가 이러한 메모리 블록이 즉시 필요하다고 판단하면 mysqld 프로세스용으로 예약됩니다. 이는 mysqld가 작업을 완료하고 메모리를 해제한 후에도 여전히 많은 메모리를 차지하는 이유를 설명합니다. 🎜

실제로 이는 큰 문제가 아니며 해를 끼치면 안 됩니다. 그러나 메모리를 운영 체제로 더 빨리 반환해야 하는 경우 jemalloc과 같은 대체 메모리 할당자를 사용해 볼 수 있습니다. PS-5312입니다.

실제 생산에서는 큰 문제가 되지 않으며, 사고가 발생하지 않아야 합니다. 하지만 운영 체제에 더 빠르게 메모리를 반환해야 하는 경우 jemallolc와 같은 비전통적인 메모리 할당자를 사용해 볼 수 있습니다. PS-5312의 문제점을 해결한 것으로 입증되었습니다. jemallolc。它被证明可以解决PS-5312<链接5>的问题。

Another factor which improves memory management is the number of CPU cores: the more we used for the test, the faster the memory was returned to the operating system. This, probably, can be explained by the fact that if you have multiple CPUs, then the memory allocator can dedicate one of them just for releasing memory to the operating system.

另一个改善内存管理的因素是cpu内核数量:在测试中,cpu核数越多,内存返回给操作系统的速度会越快。这可能是你拥有多个CPU,而其中一个可专门用作内存分配器释放内存给操作系统。

The very first implementation of InnoDB full text indexes introduced this flaw. As our engineer Yura Sorokin found:

  • The very first 5.6 commit which introduces Full Text Search Functionality for InnoDB WL#5538: InnoDB Full-Text Search Support – https://dev.mysql.com/worklog/task/?id=5538

  • Implement WL #5538 InnoDB Full-Text Search Support, merge – https://github.com/mysql/mysql-server/commit/b6169e2d944 – also has this problem.

正如我们的工程师Yura Sorokin所发现的一样,下面两点阐述了InnoDB全文索引的早期实现引入了这个缺陷:

  • 5.6版本MySQL最早对InnoDB WL全文索引功能引入的介绍:#5538: InnoDB全文搜索支持 – https://dev.mysql.com/worklog/task/?id=5538

  • 实现WL #5538 InnoDB全文搜索支持与合并 - https://github.com/mysql/mysql-server/commit/b6169e2d944 - 也存在同样的问题问题

修复方法

We have a few options to fix this:

  1. Change implementation of InnoDB fulltext index

  2. Use custom memory library like jemalloc

Both have their advantages and disadvantages.

我们有两种方法来修复这个问题:

1.修改InnoDB全文索引的实现

2.使用自定义内存库,例如jemalloc

메모리 관리를 향상시키는 또 다른 요소는 CPU 코어 수입니다. 테스트에 더 많이 사용할수록 메모리가 운영 체제로 반환되는 속도가 빨라졌습니다. 이는 아마도 CPU가 여러 개 있는 경우에 설명될 수 있습니다. , 그러면 메모리 할당자는 운영 체제에 메모리를 해제하기 위해 그 중 하나를 전용으로 할당할 수 있습니다.

메모리 관리를 개선하는 또 다른 요소는 CPU 코어 수입니다. 테스트에서 CPU 코어가 많을수록 메모리가 운영 체제로 더 빨리 반환됩니다. 시스템이 더 빨라질 것입니다. 여러 개의 CPU가 있고 그 중 하나를 운영 체제의 메모리를 확보하기 위한 메모리 할당자로 독점적으로 사용할 수 있습니다.

InnoDB 전체 텍스트 인덱스의 첫 번째 구현에서 이 결함이 발생했습니다. 엔지니어 Yura Sorokin이 발견한 바에 따르면:

  • Full을 도입한 최초의 5.6 커밋입니다. InnoDB WL#5538용 텍스트 검색 기능: InnoDB 전체 텍스트 검색 지원 – https://dev.mysql.com/worklog/task/?id=5538

  • WL #5538 InnoDB Full- 구현 텍스트 검색 지원, 병합 – https://github.com/mysql/mysql-server/commit/b6169e2d944 –에도 이 문제가 있습니다.

우리 엔지니어들이 As Yura Sorokin이 발견한 바에 따르면, 다음 두 가지 점은 InnoDB 전체 텍스트 인덱스의 초기 구현으로 인해 이 결함이 발생했음을 보여줍니다.

  • MySQL 5.6 버전은 InnoDB를 최초로 소개합니다 WL 전체 텍스트 인덱싱 기능 소개 소개: #5538: InnoDB 전체 텍스트 검색 지원 – https://dev.mysql.com/worklog/task/?id=5538

  • WL #5538 InnoDB 전체 텍스트 검색 지원 및 합병 구현 - https://github.com/mysql/mysql-server/commit/b6169e2d944 - 같은 문제도 존재합니다

수정 방법

이 문제를 해결할 수 있는 몇 가지 옵션이 있습니다.

  1. InnoDB 전체 텍스트 인덱스 구현 변경
  2. 다음과 같은 사용자 정의 메모리 라이브러리 사용 jemalloc

둘 다 장점과 단점이 있습니다.

이 문제를 해결하는 방법에는 두 가지가 있습니다. 🎜🎜1 InnoDB 전체 텍스트 인덱스 구현 수정 🎜🎜2. jemalloc🎜🎜과 같은 라이브러리입니다. 두 방법 모두 장점과 단점이 있습니다. 🎜🎜옵션 1은 업스트림과의 비호환성을 도입하여 향후 버전에서 이상한 버그가 발생할 수 있음을 의미하며 이는 고객이 사용하는 GA 버전에서 항상 위험한 InnoDB 전체 텍스트 코드를 완전히 다시 작성한다는 의미이기도 합니다.🎜🎜방법 1은 소프트웨어 업스트림과의 비호환성 위험이 있음을 의미하며, 이로 인해 새 버전에서 알 수 없는 버그가 발생할 수 있습니다. 이는 또한 사용자가 사용하는 GA 버전에서는 위험할 수 있는 InnoDB 전체 텍스트 인덱스 코드의 일부를 완전히 다시 작성한다는 의미이기도 합니다. 🎜🎜옵션 2는 가장 안전한 메모리 할당 버그가 아닌 성능을 위해 설계된 jemalloc 라이브러리에 결함이 있을 수 있음을 의미합니다. 🎜🎜그래서 우리는 이상적이지 않은 두 가지 솔루션 중에서 선택해야 합니다.🎜🎜옵션 1은 Percona 서버가 업스트림과 호환되지 않는 상황으로 이어질 수 있으므로 옵션 2를 선호하며 이 버그의 업스트림 수정을 기대합니다.🎜🎜그러므로 우리는 이 두 가지 불완전한 방법 중에서 선택해야 합니다. 🎜🎜방법 1이 percona 서비스가 업스트림과 호환되지 않을 수 있다는 사실을 고려하여, 우리는 문제를 해결하기 위해 방법 2를 사용하는 것을 선호하며 업스트림이 이 버그를 수정하기를 기대합니다. 🎜🎜🎜결론🎜🎜🎜mysqld 프로세스에서 높은 메모리 사용량이 나타나는 경우 이것이 항상 메모리 누수의 증상은 아닙니다. 성능 스키마에서 메모리 계측을 사용하여 할당된 메모리가 어떻게 사용되는지 알아볼 수 있습니다. 더 나은 할당 처리 및 메모리 해제를 위한 메모리 라이브러리입니다. 여기 및 여기 페이지에서 설정 방법을 알아보려면 LD_PRELOAD에 대한 사용자 설명서를 검색하세요.🎜🎜mysqld 프로세스가 많은 메모리를 차지하는 것을 발견하면 반드시 메모리 누수가 있다는 의미는 아닙니다. 성능 스키마의 메모리 계측을 사용하여 프로세스가 할당된 메모리를 사용하는 방법을 이해할 수 있습니다. 메모리 할당 및 할당 취소를 더 잘 처리하기 위해 메모리 라이브러리를 교체해 볼 수도 있습니다. LD_RELOAD 구성 방법은 MySQL 사용자 매뉴얼 mysqld-safe 및 using-system의 해당 페이지를 참조하세요. 🎜

더 많은 프로그래밍 관련 지식을 보려면 프로그래밍 교육을 방문하세요! !

위 내용은 Chat MySQL 메모리 관리, 메모리 할당자 및 운영 체제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제