2015-01-23 5 views
2

나는 부스트의 fast_pool_allocator (버전 1.55)를 quickfix (1.13.3) 아래에 사용하는 스레드가 많은 응용 프로그램을 가지고 있습니다. 이 응용 프로그램은 하루 종일 많은 가상 메모리를 사용하여 종료 할 때까지 선형 적으로 늘어나는 많은 수의 객체를 할당합니다. 대부분의 할당은 응용 프로그램의 가상 메모리 공간이 커지는 것을 볼 때 200MB 정도입니다. 그러나 응용 프로그램을 통한 트랜잭션 흐름이 실질적으로 바뀌지는 않지만, 보통 하루 중 후반 어느 시점에서 부스트는 6GB 할당을 결정합니다.boost_pool_allocator가 가끔씩 거대한 할당을 요청합니다.

할당 자 코드를 보면 할당이 새 블록을 청크로 설정 한 후 첫 번째로 부스트가 수행됩니다. 이 함수는 simple_segregated_storage.hpp : 280에 simple_segregated_storage<SizeType>::segregate입니다. 우리는 프로세스에 디버거를 첨부하여 거대한 할당이 발생하면 그 함수 (특히 놀랍지 않게)가 실행하는 데 시간이 오래 걸리는 것을 볼 수 있습니다. 특히 302 행의 for 루프는 20-30 초 정도 소요됩니다. 그 코드는 mutex가 보호되어 할당 자 블록에서 아무 것도하지 않으려 고하는 모든 다른 스레드가 있습니다. 이것은 우리 고객들을 화나게합니다.

질문 : 끊임없이 그 이전에 하루 종일 ~ 2백메가바이트 블록을 요청했다 때

  1. 왜 갑자기 6기가바이트을 ALLOC 것?
  2. 할당을 어떻게해서든지 제한 할 수 있습니까? 오히려 더 작은 조각을 더 자주 요청할 것입니다.
  3. 잘못된 할당 자입니까? 이것이 퀵 픽스 개발자들에게는 문제라고 생각되지만, 이것이 선호되는 방법 인 것으로 보입니다. 할당자를 사용하는 객체는 대부분 std::mapstd::multimap입니다.
+1

그래서 10 분 동안 문서를 읽으면, 기본 풀이 한 번에 할당 할 "청크"수에 대한 제한 인 것처럼 보이는 'MaxSize' 매개 변수가 있으며 기본값은'0 '입니다 (아마도 아니요 한도). 'MaxSize'를 0이 아닌 값으로 보는 것의 영향을 조사 했습니까? – Yakk

+0

예, 그게 전부입니다. 나는 대답을 게시 할 것이다. 고맙습니다. –

답변

1

위의 Yakk이 제안한 것처럼, 부스트 풀을 사용하면 템플릿에 MaxSize를 지정할 수 있습니다. 풀의 구현 내부 개념 인 "덩어리 (chunks)"단위로 작동한다는 점에서 조금 이상합니다. IMHO 바이트는 더 자연스럽지 만 그렇게 될 것입니다.

fast_pool_allocator은 모든 템플릿 인수 (첫 번째 제외)에 대한 기본값이 정의되어 있습니다. 나는 그 기본값을 복사하고 마지막 것을 변경했다. 이 응용 프로그램의 경우 청크 크기는 88 바이트이지만 맵의 클래스에 종속되어 있다고 가정합니다.

typedef std::map <int, std::vector <FieldMap*>, std::less<int>, 
        boost::fast_pool_allocator<std::pair<const int, std::vector<FieldMap*>>, 
              boost::default_user_allocator_new_delete, 
              boost::details::pool::default_mutex, 
              32,  // NextSize (default from boost) 
              1500000 // MaxSize, in 88 byte chunks. 
              >> Groups; 

이 경우 1500000 * 88 = 132M으로 할당량을 현재 원하는만큼 크게 설정합니다.

+0

'MaxSize'는 캐핑을위한 것이 아니며 다음에 시스템에서 요청한 청크의 수와 관련이 있습니다. 이 [post] (http://stackoverflow.com/questions/16771539/boost-pool-maximum-size/22953544#22953544)를 참조하십시오. – jfly