httpd の2
どうも、MinGW/CygwinだとsocketのAcceptに異常に時間が掛かるようだ。これはWinsockの問題のようなのでmosh側ではどうしようもない。
x64のLinux上で試したところ無事8000rps程度を記録(local時)。ただ、並列度がかなり低い(1.5程度/2core)。コードの負荷よりもGCの負荷が圧倒的に大きく、現状ではparallel-markを有効にしていないので、今後コードを増やしていけばより並列度は向上すると考えている。
両者に共通するのは、何故かgdb上ではなかなか落ちないという点。もちろん、ワーカスレッドを50とか100にすればgdb上でも落ちる。
(gdb) bt #0 0x00002ad14b7d3114 in std::_Rb_tree_rotate_left () from /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.2/libstdc++.so.6 #1 0x00002ad14b7d3364 in std::_Rb_tree_insert_and_rebalance () from /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.2/libstdc++.so.6 #2 0x0000000000406d9c in std::_Rb_tree<int const* const, std::pair <int const* const, scheme::Object>, std::_Select1st<std::pair<int const* const, scheme::Object> >, scheme::ltstr, gc_allocator<std::pair<int const* const, scheme::Object> > >::_M_insert_ (this=0xa20f80, __x=<value optimized out>, __p=0x8b45780, __v=@0x4680b5a0) at /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.2/include/g++-v4/bits/stl_tree.h:854 #3 0x00000000004076e7 in std::_Rb_tree<int const* const, std::pair <int const* const, scheme::Object>, std::_Select1st<std::pair<int const* const, scheme::Object> >, scheme::ltstr, gc_allocator<std::pair<int const* const, scheme::Object> > >::_M_insert_unique_ (this=0xa20f80, __position={_M_node = 0x248f900}, __v=@0x4680b5a0) at /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.2/include/g++-v4/bits/stl_tree.h:1201 #4 0x00000000004ac74d in scheme::gensymEx (theVM=0x37cf640, argc=<value optimized out>, argv=0x6979718) at /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.2/include/g++-v4/bits/stl_map.h:496 #5 0x000000000041adc1 in scheme::CProcedure::call (this=0x0, theVM=0x8b45780, argc=10620816, argv=0x0) at CProcedure.h:47
evalだけが原因では無いようで、当たり所が悪いと別のエラーも出る。
Condition components: 1. &i/o-read 2. &lexical 3. &who who: "read" 4. &message message: "(): syntax error near [-inewline)\n] at <transcoded-textual-input-port <binary-input-port ./ext/serverport/body.mosh.ss>>:32. " 5. &irritants irritants: ()
ワーカスレッドはほどほどの数にするのが良いようだ。