나는 부스트의 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백메가바이트 블록을 요청했다 때
- 왜 갑자기 6기가바이트을 ALLOC 것?
- 할당을 어떻게해서든지 제한 할 수 있습니까? 오히려 더 작은 조각을 더 자주 요청할 것입니다.
- 잘못된 할당 자입니까? 이것이 퀵 픽스 개발자들에게는 문제라고 생각되지만, 이것이 선호되는 방법 인 것으로 보입니다. 할당자를 사용하는 객체는 대부분
std::map
및std::multimap
입니다.
그래서 10 분 동안 문서를 읽으면, 기본 풀이 한 번에 할당 할 "청크"수에 대한 제한 인 것처럼 보이는 'MaxSize' 매개 변수가 있으며 기본값은'0 '입니다 (아마도 아니요 한도). 'MaxSize'를 0이 아닌 값으로 보는 것의 영향을 조사 했습니까? – Yakk
예, 그게 전부입니다. 나는 대답을 게시 할 것이다. 고맙습니다. –