문제

나는 현재 다중 스레드 서버 애플리케이션을 많이 가지고 있으며 좋은 멀티 스레드 메모리 할당기를 쇼핑하고 있습니다.

지금까지 나는 사이에 찢어졌다 :

  • 태양의 움
  • Google의 TCMalloc
  • 인텔의 스레딩 빌딩 블록 할당 차단
  • 에머리 버거의 비장

내가 찾은 것에서 비축이 가장 빠를 수도 있지만 오늘은 들어 보지 못했기 때문에 정말 좋은 것처럼 회의적입니다. 이 할당자를 시도하는 개인적인 경험이 있습니까?

도움이 되었습니까?

해결책

나는 tcmalloc을 사용하고 Hoard에 대해 읽었습니다. 둘 다 유사한 구현을 가지고 있으며 스레드/CPU의 수와 관련하여 대략 선형 성능 스케일링을 달성합니다 (해당 사이트의 그래프에 따라).

따라서 성능이 정말로 매우 중요하다면 성능/로드 테스트를 수행하십시오. 그렇지 않으면 주사위를 굴려서 나열된 것 중 하나를 골라냅니다 (대상 플랫폼에서 사용하기 쉽게 가중치).

그리고 Trshiv의 링크, 그것은 비축, tcmalloc 및 ptmalloc처럼 보입니다. 전반적으로 TT는 PTMalloc이 가능한 한 적은 공간을 취하는 데 최적화 된 것처럼 보이며, Hoard는 속도 + 메모리 사용량의 절충에 최적화되며 TCMalloc은 순수한 속도로 최적화됩니다.

다른 팁

응용 프로그램에 적합한 메모리 할당자가 실제로 어떤 메모리 할당자를 알리는 유일한 방법은 몇 가지를 시도하는 것입니다. 언급 된 모든 할당자는 똑똑한 사람들에 의해 작성되었으며 하나의 특정 마이크로 벤치 마크 또는 다른 사람에서 다른 사람들을 이길 것입니다. 하루 종일 모든 응용 프로그램이 Malloc One 8 Byte Chunk이고 스레드 B에서 무료로 사용하고 다른 것을 처리 할 필요가 없다면 아마도 바지를이기는 메모리 할당자를 작성할 수 있습니다. 지금까지 나열된 것들. 다른 많은 사람들에게는 그다지 유용하지 않습니다. :)

나는 내가 일하는 곳에서 Hoard를 사용한 경험이 있습니다 (최근 3.8 릴리스에서 다루어진 더 모호한 버그 중 하나가 그 경험의 결과로 발견되었습니다). 그것은 아주 좋은 할당 자입니다. 그러나 당신에게 얼마나 좋은지는 당신의 작업량에 달려 있습니다. 그리고 코드를 gpl '하지 않고 상용 프로젝트에서 사용하려면 비축에 대한 비용을 지불해야합니다 (너무 비싸지는 않지만).

매우 약간 적응 된 ptmalloc2는 꽤 오랫동안 Glibc의 malloc 뒤에 배당자가되었으므로 엄청나게 널리 사용되고 테스트되었습니다. 안정성이 모든 것보다 중요하다면 좋은 선택 일 수 있지만 목록에서 언급하지 않았으므로 외출 당했다고 가정 할 것입니다. 특정 워크로드의 경우 끔찍하지만 범용 Malloc에서도 마찬가지입니다.

당신이 그것을 기꺼이 지불하고 있다면 (그리고 가격은 내 경험에 따라 합리적입니다), Smartheap SMP 또한 좋은 선택입니다. 언급 된 다른 할당 자의 대부분은 LD_PRELOAD'D 일 수있는 드롭 인 Malloc/Free New/Delete 교체로 설계되었습니다. Smartheap은 그런 식으로도 사용할 수 있지만 전체 할당 관련 API가 포함되어있어 할당자를 심장의 내용에 미세 조정할 수 있습니다. 우리가 한 테스트에서 (다시, 특정 응용 프로그램에 매우 구체적으로), Smartheap은 드롭 인 Malloc 교체 역할을 할 때 성능을위한 비장과 거의 동일했습니다. 둘 사이의 실제 차이점은 사용자 정의 정도입니다. 당신은 당신이 할당자를 필요로하는 일반적인 목적보다 더 나은 성능을 얻을 수 있습니다.

그리고 유스 케이스에 따라 일반 목적 멀티 스레드 할당자는 전혀 사용하고 싶은 것이 아닐 수도 있습니다. 당신이 끊임없이 malloc & free'ing 객체가 모두 같은 크기 인 경우 간단한 슬래브 할당자를 작성할 수 있습니다. 슬래브 할당은 해당 설명에 맞는 Linux 커널의 여러 장소에서 사용됩니다. (나는 당신에게 몇 가지 유용한 링크를 줄 것이지만 나는 "새로운 사용자"이고 스택 오버플로는 새로운 사용자가 허용되지 않기로 결정했습니다. ~도 한 가지 대답으로 모두 도움이됩니다. 그래도 Google은 충분히 도움이 될 수 있습니다.)

나는 개인적으로 ptmalloc을 멀티 스레드 할당 자로 선호하고 추천합니다. Hoard는 좋지만, 몇 년 전 우리 팀은 Hoard와 Ptmalloc 사이에서 한 평가에서 Ptmalloc이 더 좋았습니다. 내가 아는 바와 같이, Ptmalloc은 몇 년 동안 주변에 있었고 멀티 스레드 할당 자로 널리 사용되었습니다.

당신은 찾을 수 있습니다 이 비교 유용한.

어쩌면 이것은 당신이 요구하는 것에 접근하는 잘못된 방법 일지 모르지만, 다른 전술이 완전히 사용될 수 있습니다. 당신이 정말 빠른 메모리 할당자를 찾고 있다면 아마도 변수의 스택 할당으로 도망 갈 수있을 때 메모리를 할당하는 시간을 항상 할당 해야하는 이유를 물어봐야합니다. 더 성가신 길을 쌓을 수는 있지만, 올바르게 수행하면 뮤 테스 경합을 방해 할 수있을뿐만 아니라 코드에서 이상한 메모리 손상 문제를 유지할 수 있습니다. 또한, 당신은 잠재적으로 도움이 될 수있는 조각화가 적습니다.

우리는 몇 년 전에 일한 프로젝트에 비축을 사용했습니다. 잘 작동하는 것 같았습니다. 나는 다른 할당 자와 경험이 없습니다. 다른 것을 시도하고로드 테스트를 수행하는 것은 매우 쉬워야합니까?

Locklessinc Allocator는 매우 훌륭하고 질문이 있으면 개발자가 반응합니다. 그가 사용한 최적화 트릭 중 일부에 대해 쓴 기사가 있습니다. 흥미로운 읽기입니다. http://locklessinc.com/articles/allocator_tricks/. 과거에 훌륭한 결과와 함께 사용했습니다.

enter image description here

아마도 당신의 질문에 대한 늦은 응답이지만

성능을 가지고 있다면 왜 Malloc을해야합니까?

더 나은 방법은 초기화에서 큰 메모리 창의 malloc을 수행하고 다음을 생각해내는 것입니다. light weight Memory manager 그럴 것입니다 lease out the memory chunks at run time.

이는 힙 확장시 시스템 호출 가능성을 피합니다.

당신은 시도 할 수 있습니다 ltalloc (빠른 풀 풀 할당 속도가있는 범용 글로벌 메모리 할당).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top