v3.1.0-1でメモリリークが発生
原因は以下のコミットで https://sourceforge.jp/projects/ultramonkey-l7/scm/git/ultramonkey-l7-v3/commits/6f2218216860555ecf2243cdc51758a0e9a2f614 virtualservice.h にsession_thread_control *waiting_stc; というポインタを格納する変数が追加されていますが、 virtualservice_tcp.cpp のfinalize処理の中で、 //waiting thread delete waiting_stc->join(); 上記処理を行った後deleteされていないためだと考えられます。 修正案をfix_memory_leakというブランチにpushしました https://sourceforge.jp/projects/ultramonkey-l7/scm/git/ultramonkey-l7-v3/commits/0b14676017a61a86099fd0e4e288eb810fc32c4d 以上、宜しくお願い申し上げます。
上記修正で、valgrindの実行結果からpossivlyが0になる事が確認できたが、 以下の動作を繰り返したところ # /etc/init.d/l7vsd start # l7vsadm -A -t 192.168.2.16:11080 -m sessionless ☆ここから先の操作を繰り返し行う # ps aux | grep "l7vsd\|RSS" | grep -v grep # l7vsadm -D -t 192.168.2.16:11080 -m sessionless # l7vsadm -A -t 192.168.2.16:11080 -m sessionless VSZが増加しているため、まだメモリリークが存在していると考えられる # ps aux | grep "l7vsd\|RSS" | grep -v grep USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 6990 1.9 0.7 3014556 60452 ? Ssl 18:31 0:00 l7vsd # ps aux | grep "l7vsd\|RSS" | grep -v grep USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 6990 1.8 0.7 3026888 63432 ? Ssl 18:31 0:01 l7vsd # ps aux | grep "l7vsd\|RSS" | grep -v grep USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 6990 1.8 0.7 3039188 65504 ? Ssl 18:31 0:01 l7vsd # ps aux | grep "l7vsd\|RSS" | grep -v grep USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 6990 1.7 0.8 3051488 67572 ? Ssl 18:31 0:02 l7vsd
diff --git a/l7vsd/include/virtualservice.h b/l7vsd/include/virtualservice.h index da06cd3..5aeb190 100644 --- a/l7vsd/include/virtualservice.h +++ b/l7vsd/include/virtualservice.h @@ -621,6 +621,8 @@ public: void run(); void stop(); + boost::shared_ptr<boost::thread> vs_thread_ptr; + void connection_active(const boost::asio::ip::tcp::endpoint &); void connection_inactive(const boost::asio::ip::tcp::endpoint &); void release_session(const tcp_session *session_ptr); diff --git a/l7vsd/src/l7vsd.cpp b/l7vsd/src/l7vsd.cpp index a5eff71..33b4d89 100644 --- a/l7vsd/src/l7vsd.cpp +++ b/l7vsd/src/l7vsd.cpp @@ -249,7 +249,7 @@ void l7vsd::add_virtual_service(const virtualservice_element *in_vselement, e try { // create thread and run - vs_threads.create_thread(boost::bind(&virtual_service::run, vsptr)); + (*vsptr).vs_thread_ptr = boost::shared_ptr<boost::thread>(vs_threads.create_thread(boost: } catch (...) { std::stringstream buf; @@ -348,6 +348,8 @@ void l7vsd::del_virtual_service(const virtualservice_element *in_vselement, e if (vslist.end() != vsitr) { // vs stop (*vsitr)->stop(); + (*vsitr)->vs_thread_ptr->join(); + vs_threads.remove_thread((*vsitr)->vs_thread_ptr.get()); // vs finalize (*vsitr)->finalize(err);
# l7vsadm -C 実行時の処理も、上記の処理と合わせるよう修正 diff --git a/l7vsd/src/l7vsd.cpp b/l7vsd/src/l7vsd.cpp index 33b4d89..f71bd06 100644 --- a/l7vsd/src/l7vsd.cpp +++ b/l7vsd/src/l7vsd.cpp @@ -793,14 +793,14 @@ void l7vsd::flush_virtual_service(error_code &err) // vs stop (*itr)->stop(); + // join virtualservice threads + (*itr)->vs_thread_ptr->join(); + vs_threads.remove_thread((*itr)->vs_thread_ptr.get()); // vs finalize (*itr)->finalize(err); } } - // join virtualservice threads - vs_threads.join_all(); - // replication switch to slave rep->switch_to_slave(); }
詳細