source

C/C++용 다중 스레드 메모리 할당기

ittop 2023. 10. 14. 10:38
반응형

C/C++용 다중 스레드 메모리 할당기

저는 현재 멀티스레드 서버 애플리케이션을 많이 보유하고 있으며, 좋은 멀티스레드 메모리 할당기를 찾고 있습니다.

지금까지 나는 사이가 좋지 않았습니다.

  • 태양우미
  • 구글의 tcmalloc
  • 인텔의 스레딩 빌딩 블록 할당기
  • 에머리 버거의 사재기

제가 봤을 때 사재기가 가장 빠를 수도 있지만, 오늘 전에는 들어본 적이 없어서 정말 보기만 한 것인지 회의적입니다.이 할당자들을 시험해 본 경험이 있는 사람?

Tcmalloc을 사용해보았고, Hoard에 대해서 읽었습니다.둘 다 비슷한 구현을 하고 있으며, 스레드/CPU 수에 따라 대략적으로 선형적인 성능 확장을 달성합니다(각 사이트의 그래프에 따르면).

따라서 성능이 매우 중요한 경우 성능/부하 테스트를 수행합니다.그렇지 않으면 주사위를 굴려서 나열된 것 중 하나를 선택하면 됩니다(목표 플랫폼에서 사용 편의성에 따라 가중치가 부여됨).

그리고 trshiv의 링크를 보면, Hoard, tcmalloc, ptmalloc 모두 대략적으로 속도와 비슷한 것 같습니다.전반적으로 ptmalloc은 가능한 한 적은 공간을 차지하는데 최적화된 것으로 보이며, Hoard는 속도+메모리 사용량의 절충에 최적화된 것으로 보이며, tcmalloc은 순수한 속도에 최적화된 것으로 보입니다.

응용 프로그램에 적합한 메모리 할당자를 구분할 수 있는 유일한 방법은 몇 가지를 시도해 보는 것입니다.언급된 모든 할당자는 똑똑한 사람들에 의해 작성되었으며 특정 마이크로벤치마크에서 다른 할당자들을 능가할 것입니다.하루 종일 응용 프로그램이 스레드 A에서 8바이트 청크를 멀로콘하고 스레드 B에서 자유롭게 하는 것뿐이고 다른 것을 전혀 처리할 필요가 없다면 지금까지 나열된 모든 것을 능가하는 메모리 할당기를 작성할 수 있을 것입니다.다른 데는 별로 유용하지 않을 뿐입니다. :)

저는 제가 일하는 곳에서 사재기를 사용한 경험이 있습니다(그 경험의 결과로 최근 3.8 릴리스에서 다루어진 더 모호한 버그 중 하나가 발견될 정도로 충분합니다).이는 매우 훌륭한 할당자이지만, 작업량에 따라 귀하에게 얼마나 적합한지가 결정됩니다.그리고 코드를 GPL하지 않고 상업적인 프로젝트에 사용하기 위해서는 사재기 비용을 지불해야 합니다(비록 너무 비싸지는 않지만).

매우 약간 적응된 ptmalloc2는 지금까지 꽤 오랫동안 glibc의 malloc 뒤에 있는 할당자였습니다. 그래서 그것은 엄청나게 널리 사용되고 테스트되었습니다.무엇보다 안정성이 중요하다면 좋은 선택일 수도 있지만, 리스트에 언급하지 않으셨기 때문에 제외된 것으로 추정하겠습니다.특정 워크로드의 경우에는 끔찍하지만, 범용 malloc의 경우에도 마찬가지입니다.

비용을 지불할 의사가 있다면(제 경험으로는 가격이 적당합니다), SmartHeap SMP도 좋은 선택입니다.언급된 다른 할당자의 대부분은 LD_PRELOAD'일 수 있는 드롭인 malloc/free new/delete 대체품으로 설계되었습니다.SmartHeap도 그렇게 사용할 수 있지만, 할당자를 마음껏 미세 조정할 수 있는 전체 할당 관련 API도 포함되어 있습니다.우리가 실시한 테스트에서 SmartHeap은 드롭인 malloc 대체 기능을 수행할 때 성능을 위한 Hoard와 거의 동일했습니다. 둘 사이의 실질적인 차이는 사용자 지정의 정도입니다.할당자가 필요로 하지 않는 일반적인 목적일수록 더 나은 성능을 얻을 수 있습니다.

또한 사용 사례에 따라 범용 다중 스레드 할당기는 사용하고자 하는 용도가 아닐 수도 있습니다. 모든 크기가 동일한 개체를 항상 malloc & free'할 경우 단순한 슬랩 할당기를 작성하는 것이 좋습니다.해당 설명에 맞는 Linux 커널의 여러 곳에서 슬랩 할당이 사용됩니다.몇 가지 유용한 링크를 더 드리겠지만, 저는 "새로운 사용자"이고 스택 오버플로는 새로운 사용자가 한 답변에 너무 도움이 되는 것은 허용되지 않는다고 결정했습니다.하지만 구글은 충분히 도울 수 있습니다.)

저는 개인적으로 멀티 스레드 할당자로 ptmalloc을 선호하고 추천합니다.사재기도 좋지만 몇 년 전 우리 팀이 사재기와 ptmalloc 사이에서 한 평가에서는 ptmalloc이 더 나았습니다.ptmalloc은 몇 년 전부터 존재해 온 것으로 알고 있으며 멀티스레드 할당기로 꽤 널리 사용되고 있습니다.

이 비교가 유용하다고 생각할 수 있습니다.

어쩌면 이것은 당신이 요구하는 것에 접근하는 잘못된 방법일 수도 있지만, 어쩌면 다른 전략을 사용할 수도 있습니다.정말 빠른 메모리 할당자를 찾고 있다면 변수 스택 할당에서 벗어날 수 있는데 왜 그렇게 많은 시간을 메모리 할당에 소비해야 하는지 질문해야 할 것입니다.스택 할당은 훨씬 더 성가신 일이지만 올바르게 수행되면 뮤텍스 경합을 방지할 수 있을 뿐만 아니라 이상한 메모리 손상 문제를 코드에서 제거할 수 있습니다.또한 잠재적으로 파편화가 적어 도움이 될 수도 있습니다.

우리는 몇 년 전에 내가 일했던 프로젝트에 사재기를 사용했습니다.잘 된 것 같던데요.저는 다른 할당자들에 대한 경험이 없습니다.다양한 것을 시도하고 부하 테스트를 하는 것은 꽤 쉬울 것입니다, 아닌가요?

잠금장치가 없는 incallocator는 매우 훌륭하고 궁금한 점이 있으면 개발자가 대응합니다.그가 사용한 최적화 기법 중 일부에 대해 쓴 기사가 있는데, 흥미로운 내용입니다. http://locklessinc.com/articles/allocator_tricks/ .예전에도 좋은 결과로 사용한 적이 있습니다.

enter image description here

질문에 대한 답변이 늦었을 수도 있지만,

성능 향상이 있다면 왜 말로크를 해야 합니까?

더 좋은 방법은 초기화할 때 큰 메모리 창을 여러 개 만들고 그 다음에 생각해 내는 것입니다.light weight Memory manager그럴 것입니다lease out the memory chunks at run time.

이렇게 하면 힙이 확장될 경우 시스템 호출이 발생할 가능성이 없습니다.

ltalloc(고속 풀 할당기의 속도를 가진 범용 글로벌 메모리 할당기)를 사용해 볼 수 있습니다.

언급URL : https://stackoverflow.com/questions/147298/multithreaded-memory-allocators-for-c-c

반응형