チケット #33102

v3.1.0-1でメモリリークが発生

登録: 2014-02-06 16:31 最終更新: 2014-03-26 11:05

報告者:
担当者:
チケットの種類:
状況:
完了
コンポーネント:
マイルストーン:
(未割り当て)
優先度:
5 - 中
重要度:
5 - 中
解決法:
修正済み
ファイル:
なし

詳細

v3.1.0で仮想サービスの削除を行う際に、
メモリーリークが発生しているようです。

(メモリーリークが発生確認時の操作)
# valgrind -v --error-limit=no --leak-check=yes --show-reachable=no /usr/sbin/l7vsd 2>&1
# l7vsadm -A -t VIP:PORT -m sessionless
# l7vsadm -D -t VIP:PORT -m sessionless

(valgrind 実行結果)

(snip)
==27831==
==27831== 352 bytes in 1 blocks are possibly lost in loss record 27 of 34
==27831==    at 0x4A0577B: calloc (vg_replace_malloc.c:593)
==27831==    by 0x309C011812: _dl_allocate_tls (in /lib64/ld-2.12.so)
==27831==    by 0x309D007068: pthread_create@@GLIBC_2.2.5 (in /lib64/libpthread-2.12.so)
==27831==    by 0x501C876: boost::thread::start_thread() (in /usr/lib64/libboost_thread-mt.so.5)
==27831==    by 0x51F01F: l7vs::session_thread_control::start_thread() (thread.hpp:239)
==27831==    by 0x506233: l7vs::virtualservice_tcp::initialize(l7vs::error_code&) (virtualservice_tcp.cpp:840)
==27831==    by 0x51DC3E: l7vs::virtual_service::initialize(l7vs::error_code&) (virtualservice.cpp:60)
==27831==    by 0x4BA493: l7vs::l7vsd::add_virtual_service(l7vs::virtualservice_element const*, l7vs::error_code&) (l7vsd.cpp:242)
==27831==    by 0x52FD5D: l7vs::command_session::execute_command() (function_template.hpp:1013)
==27831==    by 0x53058C: l7vs::command_session::handle_read(boost::system::error_code const&, unsigned long) (command_session.cpp:108)
==27831==    by 0x5391D0: boost::asio::detail::handler_queue::handler_wrapper<boost::asio::detail::binder2<boost::_bi::bind_t<void, boost::_mfi::mf2<void, l7vs::command_session, boost::system::error_code const&, unsigned long>, boost::_bi::list3<boost::_bi::value<boost::shared_ptr<l7vs::command_session>  >, boost::arg<1>  (*)(), boost::arg<2>  (*)()>  >, boost::system::error_code, unsigned long>  >::do_call(boost::asio::detail::handler_queue::handler*) (mem_fn_template.hpp:265)
==27831==    by 0x4C1233: l7vs::l7vsd::run(int, char**) (handler_queue.hpp:39)
==27831==
==27831== LEAK SUMMARY:
==27831==    definitely lost: 0 bytes in 0 blocks
==27831==    indirectly lost: 0 bytes in 0 blocks
==27831==      possibly lost: 704 bytes in 2 blocks
==27831==    still reachable: 16,296 bytes in 65 blocks
==27831==         suppressed: 0 bytes in 0 blocks
(snip) 

チケットの履歴 (7 件中 3 件表示)

2014-02-06 16:31 更新者: hibari
  • 新しいチケット "v3.1.0-1でメモリリークが発生" が作成されました
2014-02-06 16:32 更新者: hibari
  • 詳細が更新されました
コメント
原因は以下のコミットで
​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


以上、宜しくお願い申し上げます。 
2014-02-24 14:56 更新者: None
コメント
上記修正で、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
2014-02-24 14:59 更新者: None
コメント
  • 仮想サービス追加時に作成したスレッドの情報が仮想サービス削除時に解放されていないことが原因
    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);
    
2014-02-24 15:00 更新者: None
コメント
  • ブランチ:fix_memory_leak に合わせて修正を入れた
2014-02-26 09:49 更新者: hibari
コメント
# 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();
 }
2014-03-26 11:05 更新者: hibari
  • 解決法なし から 修正済み に更新されました
  • 状況オープン から 完了 に更新されました
  • チケット完了時刻2014-03-26 11:05 に更新されました

添付ファイルリスト

添付ファイルはありません

編集

ログインしていません。ログインしていない状態では、コメントに記載者の記録が残りません。 » ログインする