0

しばらくの間、32 ビット Linux でブースト スレッドを使用してきましたが、これまでのパフォーマンスに非常に満足しています。最近、プロジェクトが 64 ビット プラットフォームに移行され、メモリ使用量が大幅に増加しました (約 2.5 GB から 16 ~ 17 GB に)。プロファイリングを行ったところ、ブースト スレッドが大量の割り当ての原因であることがわかりました。各スレッドは、32 ビットで行っていたものの約 10 倍を割り当てています。

valgrind の massif を使用してプロファイリングし、別のテスト アプリケーションでブースト スレッドのみを使用して問題を確認しました。代わりに std::threads も使用してみましたが、これらは大きなメモリ割り当ての問題を示していません。

他の誰かがこの動作を見て、問題が何であるかを知っているかどうか疑問に思っていますか? ありがとう。

4

2 に答える 2

3

1. スレッドごとのスタックサイズ

pthread_attr_getstacksize を使用して表示します。boost::thread::attributes を使用して変更します (pthread_attr_setstacksize)。

2. glibc の malloc のスレッドごとの pre-mmap

boost.thread の gdb の例

0  0x000000000040ffe0 in boost::detail::get_once_per_thread_epoch() ()  
1  0x0000000000407c12 in void boost::call_once<void (*)()>(boost::once_flag&, void (*)()) [clone .constprop.120] ()  
2  0x00000000004082cf in thread_proxy ()  
3  0x000000000041120a in start_thread (arg=0x7ffff7ffd700) at pthread_create.c:308  
4  0x00000000004c5cf9 in clone ()  
5  0x0000000000000000 in ?? ()  

data=malloc(sizeof(boost::uintmax_t));get_once_per_thread_epoch ( boost_1_50_0/libs/thread/src/pthread/once.cpp )で発見します

継続する

1  0x000000000041a0d3 in new_heap ()  
2  0x000000000041b045 in arena_get2.isra.5.part.6 ()  
3  0x000000000041ed13 in malloc ()  
4  0x0000000000401b1a in test () at pthread_malloc_8byte.cc:9  
5  0x0000000000402d3a in start_thread (arg=0x7ffff7ffd700) at pthread_create.c:308  
6  0x00000000004413d9 in clone ()  
7  0x0000000000000000 in ?? ()  

new_heap 関数 ( glibc-2.15\malloc\arena.c ) では、64 ビット OS のスレッドごとに 64M メモリを pre-mmap します。つまり、スレッドごとに64M + 8M (デフォルトのスレッド スタック) = 72Mが使用されます。

glibc-2.15\ChangeLog.17  
2009-03-13  Ulrich Drepper  <drepper@redhat.com>  
  * malloc/malloc.c: Implement PER_THREAD and ATOMIC_FASTBINS features.  
  * malloc/arena.c: Likewise.  
  * malloc/hooks.c: Likewise. 

http://werping.github.io/blog/malloc_per_thread.html

于 2013-05-06T12:12:28.380 に答える
3

大丈夫。これは仮想メモリであり、各 64 ビット プロセスは、最新のすべてのオペレーティング システムで数テラバイトの仮想メモリを割り当てることができます。基本的に無料で、どれだけ使用したかを気にする必要はありません。

基本的には、スレッド スタック用に予約されたスペースです。必要に応じて、デフォルトのスタック サイズを変更することで、これを減らすことができます。しかし、絶対に理由はありません。

于 2012-08-27T01:25:12.433 に答える