Silitra
СitizensТип контенту
Профили
Форум
Календарь
Все, що було написано Silitra
-
billing# gdb stargazer stargazer.core GNU gdb 6.1.1 [FreeBSD] Copyright 2004 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-marcel-freebsd"... Core was generated by `stargazer'. Program terminated with signal 11, Segmentation fault. Reading symbols from /usr/lib/stg/libstg_logger.so...done. Loaded symbols for /usr/lib/stg/libstg_logger.so Reading symbols from /usr/lib/stg/libstg_locker.so...done. Loaded symbols for /usr/lib/stg/libstg_locker.so Reading symbols from /usr/lib/stg/libstg_common.so...done. Loaded symbols for /usr/lib/stg/libstg_common.so Reading symbols from /usr/lib/stg/libscript_executer.so...done. Loaded symbols for /usr/lib/stg/libscript_executer.so Reading symbols from /usr/lib/stg/libdotconfpp.so...done. Loaded symbols for /usr/lib/stg/libdotconfpp.so Reading symbols from /usr/local/lib/libexpat.so.6...done. Loaded symbols for /usr/local/lib/libexpat.so.6 Reading symbols from /lib/libthr.so.3...done. Loaded symbols for /lib/libthr.so.3 Reading symbols from /lib/libc.so.7...done. Loaded symbols for /lib/libc.so.7 Reading symbols from /usr/lib/libstdc++.so.6...done. Loaded symbols for /usr/lib/libstdc++.so.6 Reading symbols from /lib/libm.so.5...done. Loaded symbols for /lib/libm.so.5 Reading symbols from /lib/libgcc_s.so.1...done. Loaded symbols for /lib/libgcc_s.so.1 Reading symbols from /usr/lib/stg/libstg_crypto.so...done. Loaded symbols for /usr/lib/stg/libstg_crypto.so Reading symbols from /usr/lib/stg/mod_store_mysql.so...done. Loaded symbols for /usr/lib/stg/mod_store_mysql.so Reading symbols from /usr/local/lib/mysql/libmysqlclient_r.so.16...done. Loaded symbols for /usr/local/lib/mysql/libmysqlclient_r.so.16 Reading symbols from /lib/libcrypt.so.4...done. Loaded symbols for /lib/libcrypt.so.4 Reading symbols from /lib/libz.so.4...done. Loaded symbols for /lib/libz.so.4 Reading symbols from /usr/lib/stg/mod_auth_ao.so...done. Loaded symbols for /usr/lib/stg/mod_auth_ao.so Reading symbols from /usr/lib/stg/mod_auth_ia.so...done. Loaded symbols for /usr/lib/stg/mod_auth_ia.so Reading symbols from /usr/lib/stg/mod_conf_sg.so...done. Loaded symbols for /usr/lib/stg/mod_conf_sg.so Reading symbols from /usr/lib/stg/mod_cap_netflow.so...done. Loaded symbols for /usr/lib/stg/mod_cap_netflow.so Reading symbols from /libexec/ld-elf.so.1...done. Loaded symbols for /libexec/ld-elf.so.1 #0 0x0809c2e8 in std::_List_const_iterator<TARIFF>::operator++ (this=0xbf3f7430) at stl_list.h:224 224 _M_node = _M_node->_M_next; [New Thread 0x28401900 (LWP 100262)] [New Thread 0x28401800 (LWP 100199)] [New Thread 0x28401700 (LWP 100161)] [New Thread 0x28401600 (LWP 100150)] [New Thread 0x28401500 (LWP 100146)] [New Thread 0x28401400 (LWP 100134)] [New Thread 0x28401200 (LWP 100115)] [New Thread 0x28401100 (LWP 100273)] (gdb) bt #0 0x0809c2e8 in std::_List_const_iterator<TARIFF>::operator++ (this=0xbf3f7430) at stl_list.h:224 #1 0x0809c31a in std::__distance<std::_List_const_iterator<TARIFF> > (__first={_M_node = 0x6c6c6f63}, __last={_M_node = 0x2841d018}) at stl_iterator_base_funcs.h:84 #2 0x0809c36b in std::distance<std::_List_const_iterator<TARIFF> > (__first={_M_node = 0x2843bb56}, __last={_M_node = 0x2841d018}) at stl_iterator_base_funcs.h:119 #3 0x0809c39b in std::list<TARIFF, std::allocator<TARIFF> >::size (this=0x2841d018) at stl_list.h:660 #4 0x0809b82a in TARIFFS::GetTariffsNum (this=0x2841d000) at tariffs.cpp:119 #5 0x286b9f24 in PARSER_GET_SERVER_INFO::CreateAnswer (this=0x2844806c) at parser.cpp:82 #6 0x286b1905 in PARSER_GET_SERVER_INFO::ParseEnd (this=0x2844806c, data=0x2844801c, el=0x2a103008 "GetServerInfo") at parser.cpp:43 #7 0x286ad2b1 in ParseXMLEnd (data=0x2844801c, el=0x2a103008 "GetServerInfo") at configproto.cpp:77 #8 0x2812912c in doContent () from /usr/local/lib/libexpat.so.6 #9 0x28129fdd in contentProcessor () from /usr/local/lib/libexpat.so.6 #10 0x2812368c in XML_ParseBuffer () from /usr/local/lib/libexpat.so.6 #11 0x2812572e in XML_Parse () from /usr/local/lib/libexpat.so.6 #12 0x286ad4ed in CONFIGPROTO::ParseCommand (this=0x2844801c) at configproto.cpp:171 #13 0x286ab85f in CONFIGPROTO::RecvData (this=0x2844801c, sock=3) at rsconf.cpp:506 #14 0x286abf81 in CONFIGPROTO::Run (a=0x2844801c) at rsconf.cpp:255 #15 0x286a6ff6 in STG_CONFIG::Run (d=0x28448000) at stgconfig.cpp:234 #16 0x28147b1f in pthread_getprio () from /lib/libthr.so.3 #17 0x00000000 in ?? () (gdb) f 4 #4 0x0809b82a in TARIFFS::GetTariffsNum (this=0x2841d000) at tariffs.cpp:119 warning: Source file is more recent than executable. 119 printfd(__FILE__, "Get tariffNum %d \n",tariffs.size()); (gdb) p tariffs $1 = {<std::_List_base<TARIFF,std::allocator<TARIFF> >> = { _M_impl = {<std::allocator<std::_List_node<TARIFF> >> = {<__gnu_cxx::new_allocator<std::_List_node<TARIFF> >> = {<No data fields>}, <No data fields>}, _M_node = {_M_next = 0x2843bb56, _M_prev = 0x2841f020}}}, <No data fields>} (gdb) tariffs.cpp 116 int TARIFFS::GetTariffsNum() const 117 { 118 STG_LOCKER lock(&mutex, __FILE__, __LINE__); 119 printfd(__FILE__, "Get tariffNum %d \n",tariffs.size()); 120 return tariffs.size(); 121 }
-
есть еще одна проблемка стг падает при изменении юзера, а конкретно при смене тарифа. последняя строка в логе Admin 'admin', 127.0.0.1: User 'homer': 'cash' parameter changed from '0.000000' to '24.035000'. old_balance за ней должна идти Admin 'admin', 127.0.0.1: User 'homer': 'tariff' parameter changed from 'UNLIMITED_64K' to 'UNLIMITED_64K'. но ее нет, тут же сегфаульт. billing# gdb stargazer stargazer.core.100908 GNU gdb 6.1.1 [FreeBSD] Copyright 2004 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-marcel-freebsd"... Core was generated by `stargazer'. Program terminated with signal 11, Segmentation fault. Reading symbols from /usr/lib/stg/libstg_logger.so...done. Loaded symbols for /usr/lib/stg/libstg_logger.so Reading symbols from /usr/lib/stg/libstg_locker.so...done. Loaded symbols for /usr/lib/stg/libstg_locker.so Reading symbols from /usr/lib/stg/libstg_common.so...done. Loaded symbols for /usr/lib/stg/libstg_common.so Reading symbols from /usr/lib/stg/libscript_executer.so...done. Loaded symbols for /usr/lib/stg/libscript_executer.so Reading symbols from /usr/lib/stg/libdotconfpp.so...done. Loaded symbols for /usr/lib/stg/libdotconfpp.so Reading symbols from /usr/local/lib/libexpat.so.6...done. Loaded symbols for /usr/local/lib/libexpat.so.6 Reading symbols from /lib/libthr.so.3...done. Loaded symbols for /lib/libthr.so.3 Reading symbols from /lib/libc.so.7...done. Loaded symbols for /lib/libc.so.7 Reading symbols from /usr/lib/libstdc++.so.6...done. Loaded symbols for /usr/lib/libstdc++.so.6 Reading symbols from /lib/libm.so.5...done. Loaded symbols for /lib/libm.so.5 Reading symbols from /lib/libgcc_s.so.1...done. Loaded symbols for /lib/libgcc_s.so.1 Reading symbols from /usr/lib/stg/libstg_crypto.so...done. Loaded symbols for /usr/lib/stg/libstg_crypto.so Reading symbols from /usr/lib/stg/mod_store_mysql.so...done. Loaded symbols for /usr/lib/stg/mod_store_mysql.so Reading symbols from /usr/local/lib/mysql/libmysqlclient_r.so.16...done. Loaded symbols for /usr/local/lib/mysql/libmysqlclient_r.so.16 Reading symbols from /lib/libcrypt.so.4...done. Loaded symbols for /lib/libcrypt.so.4 Reading symbols from /lib/libz.so.4...done. Loaded symbols for /lib/libz.so.4 Reading symbols from /usr/lib/stg/mod_auth_ao.so...done. Loaded symbols for /usr/lib/stg/mod_auth_ao.so Reading symbols from /usr/lib/stg/mod_auth_ia.so...done. Loaded symbols for /usr/lib/stg/mod_auth_ia.so Reading symbols from /usr/lib/stg/mod_conf_sg.so...done. Loaded symbols for /usr/lib/stg/mod_conf_sg.so Reading symbols from /usr/lib/stg/mod_cap_netflow.so...done. Loaded symbols for /usr/lib/stg/mod_cap_netflow.so Reading symbols from /libexec/ld-elf.so.1...done. Loaded symbols for /libexec/ld-elf.so.1 #0 0x282beff0 in std::string::compare () from /usr/lib/libstdc++.so.6 [New Thread 0x28401900 (LWP 100258)] [New Thread 0x28401800 (LWP 100231)] [New Thread 0x28401700 (LWP 100161)] [New Thread 0x28401600 (LWP 100150)] [New Thread 0x28401500 (LWP 100146)] [New Thread 0x28401400 (LWP 100134)] [New Thread 0x28401200 (LWP 100115)] [New Thread 0x28401100 (LWP 100199)] (gdb) bt #0 0x282beff0 in std::string::compare () from /usr/lib/libstdc++.so.6 #1 0x080886f8 in std::operator==<char, std::char_traits<char>, std::allocator<char> > (__lhs=@0x2841e633, __rhs=@0xbf3f77b4) at basic_string.h:2144 #2 0x08099033 in TARIFF::operator== (this=0x2841e617, rhs=@0xbf3f7798) at tariff.cpp:142 #3 0x0809d8b8 in std::__find<std::_List_const_iterator<TARIFF>, TARIFF> (__first={_M_node = 0x2841e60f}, __last={_M_node = 0x2841d018}, __val=@0xbf3f7798) at stl_algo.h:173 #4 0x0809d912 in std::find<std::_List_const_iterator<TARIFF>, TARIFF> (__first={_M_node = 0x2841e60f}, __last={_M_node = 0x2841d018}, __val=@0xbf3f7798) at stl_algo.h:327 #5 0x0809b6f3 in TARIFFS::FindByName (this=0x2841d000, name=@0x2a1180e8) at tariffs.cpp:129 #6 0x286b45fd in PARSER_CHG_USER::AplayChanges (this=0x284480e8) at parser.cpp:1054 #7 0x286b4d6a in PARSER_CHG_USER::ParseEnd (this=0x284480e8, data=0x2844801c, el=0x2a10a0a0 "SetUser") at parser.cpp:888 #8 0x286ad2b1 in ParseXMLEnd (data=0x2844801c, el=0x2a10a0a0 "SetUser") at configproto.cpp:77 #9 0x28129264 in doContent () from /usr/local/lib/libexpat.so.6 #10 0x28129fdd in contentProcessor () from /usr/local/lib/libexpat.so.6 #11 0x2812368c in XML_ParseBuffer () from /usr/local/lib/libexpat.so.6 #12 0x2812572e in XML_Parse () from /usr/local/lib/libexpat.so.6 #13 0x286ad4ed in CONFIGPROTO::ParseCommand (this=0x2844801c) at configproto.cpp:171 #14 0x286ab85f in CONFIGPROTO::RecvData (this=0x2844801c, sock=8) at rsconf.cpp:506 #15 0x286abf81 in CONFIGPROTO::Run (a=0x2844801c) at rsconf.cpp:255 #16 0x286a6ff6 in STG_CONFIG::Run (d=0x28448000) at stgconfig.cpp:234 #17 0x28147b1f in pthread_getprio () from /lib/libthr.so.3 #18 0x00000000 in ?? () (gdb)
-
2madf конвертор может забирать данные из бд самописного билинга и импортировать их в работающий stg учитавая фильтры(например только юзеры с ип 192.168.0.%). ?
-
выруби плагин rscript
-
перед запуском killall -9 stargazer
-
Импорт производится на работающем билинге
-
Разработка модуля Netflow для STG 2.4
тема ответил в Max пользователя Silitra в Модулі для Stargazer
пользую stg-2.405.9.8 +nf + stg_web0.08 -
Разработка модуля Netflow для STG 2.4
тема ответил в Max пользователя Silitra в Модулі для Stargazer
Нет. Найденные ошибки исправляются автором. -
Эти пункты лишние: - закрывается сокет; - делается форк; - открывается TCP-сокет; Не плохо бы сделать груповые вставки, т.е формировать XML со списком юзеров, которых необходимо добавить/изменить. будет в разы быстрее. Зачем каждый раз открывать сокет ? не проще ли постоянно ждать данные? Тут где то проскочило, что некоторые из ошибок будут исправленны в след. версии. Когда ждать?
-
2den68 Детальная стата нужна да и проблема точно не в этом. 2madf Этот буфер работает не правильно, т.к в него не поступают пакеты во время FlushAndRemove. Нужна другая организация буфера. Как ускорить протокол конфигуратора, в чем заключаются его тормоза ? Вот скрипт, конвертор не юзал так как импорт производится не из стг. <? $host="*.*.*.*"; $db="****"; $user="stg"; $pass="******"; function stg_encode12($src) { $ofs = ord('a'); $dst = ""; for ($i=0; $i<strlen($src); $i++) { $c1 = (ord($src[$i]) & 15) + $ofs; $c2 = (ord($src[$i]) >> 4) + $ofs; $dst .= chr($c1).chr($c2); } return $dst; } mysql_connect($host, $user, $pass) or die("Can't connect MySQL $host"); mysql_select_db($db) or die("Can't select DB $db"); $res=mysql_query("select login, password, name, user_type, ip, balance, enabled from user"); while ($row = mysql_fetch_array($res)) { $login = $row['login']; $password = $row['password']; $name = stg_encode12($row['name']); $ip = $row['ip']; $enabled = $row['enabled']; $balance = $row['balance']; if ($enabled == "1") $enabled = "0"; else $enabled = "1"; echo $login."\n"; echo `sgconf_xml -s 195.184.79.238 -p 5555 -a admin -w ****** -r '<AddUser><login value="$login" /></AddUser>'`; echo `sgconf_xml -s 195.184.79.238 -p 5555 -a admin -w ****** -r '<SetUser><login value="$login" /><ip value="$ip" /><password value="$password" /><tariff now="tariff" /><name value="$name" /><down value="$enabled" /><cash set="$balance" msg="OLD BALANCE" /><aonline value="1" /></SetUser>'`; } mysql_free_result($res); ?>
-
Вобщем проблема с медленной записью статы решилась, сделал так в users.cpp //lastWriteStat = stgTime + random() % settings->GetStatWritePeriod(); lastWriteStat = stgTime + settings->GetStatWritePeriod(); Теперь на WriteStat для всех юзеров тратится 25 сек. так же упала нагрузка на CPU со 100% до 20-30%. И стала менее выраженной проблема потерей пакетов между mod_capture и traffcounter'ом (test# netstat -s -p udp | grep full) Вобщем тут еще одна мелкая проблемка. Запустил скрипт импорта юзеров в stg на удаленной машине, скрипт берет юзеров из базы mysql и впихивает их средствами sgconf_xml в рабочий сервер медленно но верно(кстате почему медленно?) configproto.cpp > 08:51:46 > ParseXMLStart configproto.cpp > 08:51:46 > Start parser.cpp > 08:51:46 > PARSER_GET_SERVER_INFO::ParseStart configproto.cpp > 08:51:46 > Start parser.cpp > 08:51:46 > PARSER_GET_USERS::ParseStart configproto.cpp > 08:51:46 > Start parser.cpp > 08:51:46 > PARSE_GET_USER::ParseStart login=ww.w3.org/XML/1998/namespace configproto.cpp > 08:51:46 > Start parser.cpp > 08:51:46 > PARSER_CHG_USER::Reset() parser.cpp > 08:51:46 > PARSER_CHG_USER::Reset() DEL USR ===================== parser.cpp > 08:51:46 > PARSER_CHG_USER::ParseStart el = AddUser depth = 1 parser.cpp > 08:51:46 > PARSER_CHG_USER::Reset() parser.cpp > 08:51:46 > PARSER_CHG_USER::Reset() DEL USR ===================== configproto.cpp > 08:51:46 > Start parser.cpp > 08:51:46 > PARSER_ADD_USER::ParseStart el = AddUser depth = 1 parser.cpp > 08:51:46 > PARSER_ADD_USER::AddUser - OK configproto.cpp > 08:51:46 > ParseXMLStart parser.cpp > 08:51:46 > PARSER_ADD_USER::ParseStart el = login depth = 2 parser.cpp > 08:51:46 > login parser.cpp > 08:51:46 > PARSER_ADD_USER::ParseEnd el = login depth = 2 parser.cpp > 08:51:46 > PARSER_ADD_USER::ParseEnd el = AddUser depth = 1 parser.cpp > 08:51:46 > PARSER_ADD_USER::CheckUserData() natali parser.cpp > 08:51:46 > PARSER_ADD_USER::CheckUserData() OK user.cpp > 08:51:46 > Error GetMessageHdrs Couldn't GetMessageHdrs: user.cpp > 08:51:46 > tariff=0x28418c3c, *_NO_TARIFF_* configproto.cpp > 08:51:46 > currParser == NULL rsconf.cpp > 08:51:46 > End was detected rsconf.cpp > 08:51:46 > ReciveSendConf close rsconf.cpp > 08:51:46 > CONFIGPROTO: Ready to accept user.cpp > 08:51:46 > USER::WriteStat user=fly rsconf.cpp > 08:51:46 > Connection accepted from 192.168.x.x rsconf.cpp > 08:51:46 > RecvHdr - ok buf = SG04 sizeof(STG_HEADER) = 4 проблема в том что 192.168.x.x это мой ип аддрес, во время импорта запустил конфигуратор и нажал обновить. До этого Connection accepted from 'тут был ip машины с которой велся импорт' юзеры добавляются, все работает но ip не тот, как и логин впрочем. parser.cpp > 08:51:46 > PARSE_GET_USER::ParseStart login=ww.w3.org/XML/1998/namespace что то не то с lexpat ? 2madf В каком месте он есть ? Патч к модулю netflow помогает избавится от злощастных проблем. Без буфера не учитывается 10-20% трафика. Только появляется еще одна проблема иногда данные совсем перестают поступать в traffcounter, видемо действительно нужен мьютекс
-
2 madf Закоментировал вызов WriteStat Проблема оказалась не в тормазнутости функции. stg ее вызывает редко. if (stgTime - lastWriteStat > settings->GetStatWritePeriod()) { printfd(__FILE__, "USER::WriteStat user=%s\n", GetLogin().c_str()); // WriteStat(); // WriteConf(); }
-
1) Как исправить ? 2) Если прикрутить mutex куда будут писатся данные во время flush? Потеряется смысл буфера. Как првильно сделать буфер? 3) Вывод stg. (Поток netflow не поступает в коллект), так скажим - холостой ход. Видно, что время между вызовами FlushAndRemove приходит в норму, а время исполнения WriteStat и между вызовами, такое же как и под нагрузкой. Почему так медленно ? user.cpp > 22:05:22 > USER::WriteStat user=duke1 traffcounter.cpp > 22:05:23 > FlushAndRemove() packets: 0(rem 0) ip2packets: 0(rem 0) user.cpp > 22:05:24 > USER::WriteStat user=tyutu user.cpp > 22:05:24 > USER::WriteStat user=utyut user.cpp > 22:05:26 > USER::WriteStat user=karytut user.cpp > 22:05:27 > USER::WriteStat user=uytu user.cpp > 22:05:28 > USER::WriteStat user=uyutyu user.cpp > 22:05:28 > USER::WriteStat user=utyuytu traffcounter.cpp > 22:05:28 > FlushAndRemove() packets: 0(rem 0) ip2packets: 0(rem 0) user.cpp > 22:05:29 > USER::WriteStat user=htyu user.cpp > 22:05:31 > USER::WriteStat user=virtet user.cpp > 22:05:33 > USER::WriteStat user=vortyranin traffcounter.cpp > 22:05:33 > FlushAndRemove() packets: 0(rem 0) ip2packets: 0(rem 0) user.cpp > 22:05:34 > USER::WriteStat user=putryut user.cpp > 22:05:34 > USER::WriteStat user=duyrty user.cpp > 22:05:34 > USER::WriteStat user=ddyu user.cpp > 22:05:35 > USER::WriteStat user=suytter user.cpp > 22:05:35 > USER::WriteStat user=ooytu user.cpp > 22:05:36 > USER::WriteStat user=kyturt user.cpp > 22:05:38 > USER::WriteStat user=zmuytum user.cpp > 22:05:38 > USER::WriteStat user=kiruty user.cpp > 22:05:38 > USER::WriteStat user=aliuyt traffcounter.cpp > 22:05:38 > FlushAndRemove() packets: 0(rem 0) ip2packets: 0(rem 0) user.cpp > 22:05:40 > USER::WriteStat user=foryutrd user.cpp > 22:05:40 > USER::WriteStat user=comyt user.cpp > 22:05:41 > USER::WriteStat user=vasytua user.cpp > 22:05:42 > USER::WriteStat user=mvih user.cpp > 22:05:42 > USER::WriteStat user=btswin user.cpp > 22:05:43 > USER::WriteStat user=vda user.cpp > 22:05:43 > USER::WriteStat user=miaytu user.cpp > 22:05:43 > USER::WriteStat user=dier traffcounter.cpp > 22:05:43 > FlushAndRemove() packets: 0(rem 0) ip2packets: 0(rem 0) 4) Может, но зачем писать для тех у кого нет? Может добавить условие. 5) В чем тогда сложность организации ?
-
1) public: FLOW_CAP(); virtual ~FLOW_CAP(){};//146 строка void SetUsers(USERS * u){}; 2) Вотд патчик. diff -Naur 1/netflow_cap.cpp 2/netflow_cap.cpp --- 1/netflow_cap.cpp 2007-04-24 23:53:09.000000000 +0600 +++ 2/netflow_cap.cpp 2008-08-20 21:41:15.000000000 +0600 @@ -424,7 +424,15 @@ errorStr = string("Cannot open socket!:")+errorStr; return -1; } - } + } + + nonstopBuffer = true; + /*Run flush thread*/ + if (pthread_create(&threadBuffer, NULL,RunBufferFlush , this) != 0){ + errorStr = string("Cannot run buffer thread!:")+errorStr; + return -1; + } + // errorStr = "No protocol selected"; return 0; } @@ -541,7 +549,9 @@ #endif if (dc->GenIpHead((void *)rp.pckt,sizeof(rp.pckt),&nfpack,i,100)==0){ rp.dataLen=nfpack.GetRecordByte(i); - dc->traffCnt->Process(rp); + //dc->traffCnt->Process(rp); + dc->buffer.push_back(rp); + } #ifdef DEBUG else @@ -609,7 +619,8 @@ #endif if (dc->GenIpHead((void *)rp.pckt,sizeof(rp.pckt),&nfpack,i,100)==0){ rp.dataLen=nfpack.GetRecordByte(i); - dc->traffCnt->Process(rp); + //dc->traffCnt->Process(rp); + dc->buffer.push_back(rp); } #ifdef DEBUG else @@ -741,3 +752,30 @@ } return 0; } +//---------- Buffer thread-------------------------------------------------- +void * FLOW_CAP::RunBufferFlush(void *d){ + + sleep(2); +#ifdef DEBUG + printfd(__FILE__, "=====================| pid: %d |===================== \n", getpid()); +#endif + + FLOW_CAP * dc = (FLOW_CAP *)d; + + dc->isRunningBuffer = true; + + RAW_PACKET rp; + + while (dc->nonstopBuffer){ + if(!dc->buffer.empty()){ + rp = dc->buffer.front(); + dc->buffer.pop_front(); + dc->traffCnt->Process(rp); + } + else + usleep(10); + } + dc->isRunningBuffer = false; + return NULL; +} + diff -Naur 1/netflow_cap.h 2/netflow_cap.h --- 1/netflow_cap.h 2007-04-12 19:16:50.000000000 +0600 +++ 2/netflow_cap.h 2008-08-20 21:35:49.000000000 +0600 @@ -167,6 +167,7 @@ private: static void * RunUdp(void *); static void * RunTcp(void *); + static void * RunBufferFlush(void *); int FlowTcpSocketOpen(); int FlowUdpSocketOpen(); int FlowTcpSocketClose(); @@ -179,15 +180,19 @@ mutable string errorStr; pthread_t threadUdp; pthread_t threadTcp; + pthread_t threadBuffer; bool nonstopUdp; bool nonstopTcp; + bool nonstopBuffer; bool isRunningUdp; bool isRunningTcp; + bool isRunningBuffer; int capSockUdp; int capSockTcp; MODULE_SETTINGS settings; TRAFFCOUNTER * traffCnt; + list<RAW_PACKET> buffer; }; //----------------------------------------------------------------------------- 3)Мне тоже интересно. но факт остается фактом. 4)На протежении последних 25 минут (45 минут от запуска) users.cpp > 19:36:00 > Sec = 1219325760 users.cpp > 19:36:00 > New Minute. old = 35 current = 36 users.cpp > 19:36:00 > RealDelUser() users to del: 0 user.cpp > 19:36:01 > USER::WriteStat user=truworr user.cpp > 19:36:02 > USER::WriteStat user=yvert user.cpp > 19:36:02 > USER::WriteStat user=uyin user.cpp > 19:36:03 > USER::WriteStat user=mangus и так далее. По 2-3 юзера за сек. Больше ни чего нет кроме WriteStat Смотрим юзера yvert - не автаризован. Смотрим юзера mangus - авторизован но нет ни одного байта 5)Хотя бы распредилить потоки между процессорами.
-
машинка 2 Dual Xenon 3.2 Загрузка CPU во время WriteStat 100%, грузит только 1 процессор. Может возможно оптимизировать код под многопроцессорные машины? Насколько это сложно?
-
Корка под 120Мбайт. Мне кажется, что там, что то есть. Разбирались куда теряются пакеты между сенсором и коллектором, нашли (спасибо Platex за реализацию буфера для модуля netflow), проблема была в в локе в FlushAndRemove(), за время выполнения последней в массив packets (к которому как я понимаю имеет доступ другой поток) не поступали данные от модуля Capture (причем не важно cap_nf от madf или netflow). Обнаружилась еще одна проблема, после 10-15 минут работы перестает проявлять себя traffcounter Функция FlushAndRemove перестает вызыватся вовремя или совсем. traffcounter.cpp > 05:28:07 > FlushAndRemove() packets: 3933(rem 0) ip2packets: 7866(rem 0) traffcounter.cpp > 05:28:12 > FlushAndRemove() packets: 8929(rem 0) ip2packets: 17858(rem 0) traffcounter.cpp > 05:28:17 > FlushAndRemove() packets: 13745(rem 0) ip2packets: 27490(rem 0) traffcounter.cpp > 05:28:22 > FlushAndRemove() packets: 18886(rem 0) ip2packets: 37772(rem 0) traffcounter.cpp > 05:28:27 > FlushAndRemove() packets: 23550(rem 0) ip2packets: 47100(rem 0) traffcounter.cpp > 05:28:32 > FlushAndRemove() packets: 27760(rem 0) ip2packets: 55520(rem 0) traffcounter.cpp > 05:28:43 > FlushAndRemove() packets: 26607(rem 6368) ip2packets: 53214(rem 12736) users.cpp > 05:29:00 > Sec = 1219274940 users.cpp > 05:29:00 > New Minute. old = 28 current = 29 users.cpp > 05:29:00 > RealDelUser() users to del: 0 traffcounter.cpp > 05:29:07 > FlushAndRemove() packets: 20532(rem 18304) ip2packets: 41064(rem 36608) traffcounter.cpp > 05:29:41 > FlushAndRemove() packets: 21087(rem 22535) ip2packets: 42174(rem 45070) users.cpp > 05:30:00 > Sec = 1219275000 users.cpp > 05:30:00 > New Minute. old = 29 current = 30 users.cpp > 05:30:07 > RealDelUser() users to del: 0 traffcounter.cpp > 05:30:39 > FlushAndRemove() packets: 11791(rem 42046) ip2packets: 23582(rem 84092) users.cpp > 05:31:00 > Sec = 1219275060 users.cpp > 05:31:00 > New Minute. old = 30 current = 31 users.cpp > 05:31:00 > RealDelUser() users to del: 0 users.cpp > 05:32:00 > Sec = 1219275120 users.cpp > 05:32:00 > New Minute. old = 31 current = 32 users.cpp > 05:32:00 > RealDelUser() users to del: 0 traffcounter.cpp > 05:32:18 > FlushAndRemove() packets: 10485(rem 56353) ip2packets: 20970(rem 112706) users.cpp > 05:33:00 > Sec = 1219275180 users.cpp > 05:33:00 > New Minute. old = 32 current = 33 users.cpp > 05:33:00 > RealDelUser() users to del: 0 users.cpp > 05:34:00 > Sec = 1219275240 users.cpp > 05:34:00 > New Minute. old = 33 current = 34 users.cpp > 05:34:00 > RealDelUser() users to del: 0 И еще, как только подходит время писать стату, поехали: user.cpp > 05:35:04 > USER::WriteStat user=xxxxx user.cpp > 05:35:05 > USER::WriteStat user=dffsfsf user.cpp > 05:35:05 > USER::WriteStat user=reidfs user.cpp > 05:35:05 > USER::WriteStat user=vasfsf user.cpp > 05:35:06 > USER::WriteStat user=adgffdg user.cpp > 05:35:06 > USER::WriteStat user=iregfdg user.cpp > 05:35:07 > USER::WriteStat user=eddsd user.cpp > 05:35:07 > USER::WriteStat user=dfdsf user.cpp > 05:35:08 > USER::WriteStat user=duzfdsa user.cpp > 05:35:08 > USER::WriteStat user=imdsfs user.cpp > 05:35:09 > USER::WriteStat user=valfdgery user.cpp > 05:35:09 > USER::WriteStat user=ivsfsdfa user.cpp > 05:35:10 > USER::WriteStat user=nefdsa user.cpp > 05:35:10 > USER::WriteStat user=sefsdmk user.cpp > 05:35:10 > USER::WriteStat user=sa5827 user.cpp > 05:35:11 > USER::WriteStat user=nfchaev user.cpp > 05:35:11 > USER::WriteStat user=stond user.cpp > 05:35:12 > USER::WriteStat user=vefdg user.cpp > 05:35:12 > USER::WriteStat user=tixfdsf user.cpp > 05:35:13 > USER::WriteStat user=sodfdsfs user.cpp > 05:35:13 > USER::WriteStat user=plimbom user.cpp > 05:35:14 > USER::WriteStat user=bfsdgfdsg user.cpp > 05:35:14 > USER::WriteStat user=wgffdg user.cpp > 05:35:15 > USER::WriteStat user=deefhgdsfn И так бесконечно, не останавливаясь. больше traffcounter не наблюдается. Кажется что stg пишет стату даже для тех у кого ее нет всего 3.5K юзеров. Онлайн 1К Загрузка CPU billing# systat /0 /1 /2 /3 /4 /5 /6 /7 /8 /9 /10 Load Average |||| /0% /10 /20 /30 /40 /50 /60 /70 /80 /90 /100 root idle: cpu3 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX root idle: cpu0 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX root stargazer XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX root idle: cpu2 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX root idle: cpu1 XXXXXXXXXXXXXXXXXXXXXXXXXXXX root stargazer XX
-
(gdb) bt #0 0x283dcfa0 in ?? () #1 0x283f30ba in ~FLOW_CAP (this=0x284152e0) at netflow_cap.h:146 #2 0x283f117e in ~FLOW_CAP_CREATOR (this=0x283f7ebc) at netflow_cap.cpp:64 #3 0x283eee50 in __tcf_1 () at netflow_cap.cpp:76 #4 0x282067e7 in __cxa_finalize () from /lib/libc.so.7 #5 0x283ee683 in __do_global_dtors_aux () from /usr/lib/stg/mod_cap_netflow.so #6 0x283f4eac in _fini () from /usr/lib/stg/mod_cap_netflow.so #7 0x280fd560 in ?? () from /libexec/ld-elf.so.1 #8 0x280fd3f4 in ?? () from /libexec/ld-elf.so.1 #9 0xbfbfe9d8 in ?? () #10 0x280db449 in dlsym () from /libexec/ld-elf.so.1 #11 0x280db552 in dlclose () from /libexec/ld-elf.so.1 #12 0x080d0844 in PLUGIN_RUNNER::Unload (this=0x28415248) at plugin_runner.cpp:133 #13 0x080d08ac in ~PLUGIN_RUNNER (this=0x28415248) at plugin_runner.cpp:33 #14 0x08091871 in __gnu_cxx::new_allocator<PLUGIN_RUNNER>::destroy (this=0xbfbfea9b, __p=0x28415248) at new_allocator.h:110 #15 0x080918c9 in std::_List_base<PLUGIN_RUNNER, std::allocator<PLUGIN_RUNNER> >::_M_clear (this=0xbfbfebfc) at list.tcc:78 #16 0x08091932 in ~_List_base (this=0xbfbfebfc) at stl_list.h:348 #17 0x08091981 in ~list (this=0xbfbfebfc) at stl_list.h:408 #18 0x0808f3ef in main (argc=1, argv=0xbfbfecb0) at main.cpp:743 WriteServLog("Stg stopped successfully."); sleep(1); WriteServLog("---------------------------------------------"); return 0;//743 строка
-
Запустил с модулем cap_nf в кору не падает.
-
в файле build найди echo "SHELL=/bin/bash" >> $CONFFILE замени на echo "SHELL=/bin/sh" >> $CONFFILE найди LIB_THREAD=-lc_r замени на LIB_THREAD=-lpthread В Makefile найди -lc_r \ замени на -lpthread \ В make_css.sh в первой строке #!/bin/bash поменяй на #!/bin/sh
-
billing# uname -rs FreeBSD 7.0-RELEASE stg-2.405.9.8 с родным модулем mysql При завершении падает в кору (только когда собран с debug'ом) user.cpp > 03:41:36 > Disconnect. User name 'aaa' ip=192.168.x.x user.cpp > 03:41:36 > Disconnect. User name 'bbb' ip=195.184.x.x traffcounter.cpp > 03:41:36 > FlushAndRemove() packets: 20035(rem 1163) ip2packets: 40070(rem 2326) traffcounter.cpp > 03:41:39 > TRAFFCOUNTER::Stop() users.cpp > 03:41:39 > USERS::Stop() users.cpp > 03:41:39 > RealDelUser() users to del: 0 users.cpp > 03:41:39 > Brfore USERS::Run() users.cpp > 03:42:01 > USERS::Stop() main.cpp > 03:42:02 > KillExecuters pid=3868 stgconfig.cpp > 03:42:03 > destructor STGCONFIG_CREATOR ping.cpp > 03:42:03 > destructor PING_CREATOR ao.cpp > 03:42:03 > destructor AO_CREATOR inetaccess.cpp > 03:42:03 > destructor IA_CREATOR Segmentation fault (core dumped) Лог 2008-08-17 03:37:45 -- +++++++++++++++++++++++++++++++++++++++++++++ 2008-08-17 03:41:24 -- Shutting down... 2 2008-08-17 03:41:24 -- +++++++++++++++++++++++++++++++++++++++++++++ 2008-08-17 03:41:24 -- Module: 'Stg configurator v.0.07'. Stop successfull. 2008-08-17 03:41:25 -- Module: 'Pinger v.1.01'. Stop successfull. 2008-08-17 03:41:32 -- Module: 'Always Online authorizator v.1.0'. Stop successfull. 2008-08-17 03:41:34 -- Module: 'InetAccess authorizator v.1.2'. Stop successfull. 2008-08-17 03:41:35 -- Module: 'netflow_cap v.1.3.9-beta2'. Stop successfull. 2008-08-17 03:41:39 -- Traffcounter: Stop successfull. 2008-08-17 03:42:01 -- Users: Stop successfull. 2008-08-17 03:42:02 -- Queue removed successfully. 2008-08-17 03:42:02 -- StgTimer: Stop successfull. 2008-08-17 03:42:02 -- Stg stopped successfully. 2008-08-17 03:42:03 -- --------------------------------------------- billing# gdb stargazer stargazer.core GNU gdb 6.1.1 [FreeBSD] Copyright 2004 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-marcel-freebsd"... Core was generated by `stargazer'. Program terminated with signal 11, Segmentation fault. Reading symbols from /usr/lib/stg/libstg_logger.so...done. Loaded symbols for /usr/lib/stg/libstg_logger.so Reading symbols from /usr/lib/stg/libstg_locker.so...done. Loaded symbols for /usr/lib/stg/libstg_locker.so Reading symbols from /usr/lib/stg/libstg_common.so...done. Loaded symbols for /usr/lib/stg/libstg_common.so Reading symbols from /usr/lib/stg/libscript_executer.so...done. Loaded symbols for /usr/lib/stg/libscript_executer.so Reading symbols from /usr/lib/stg/libdotconfpp.so...done. Loaded symbols for /usr/lib/stg/libdotconfpp.so Reading symbols from /usr/local/lib/libexpat.so.6...done. Loaded symbols for /usr/local/lib/libexpat.so.6 Reading symbols from /lib/libthr.so.3...done. Loaded symbols for /lib/libthr.so.3 Reading symbols from /lib/libc.so.7...done. Loaded symbols for /lib/libc.so.7 Reading symbols from /usr/lib/libstdc++.so.6...done. Loaded symbols for /usr/lib/libstdc++.so.6 Reading symbols from /lib/libm.so.5...done. Loaded symbols for /lib/libm.so.5 Reading symbols from /lib/libgcc_s.so.1...done. Loaded symbols for /lib/libgcc_s.so.1 Reading symbols from /usr/lib/stg/libstg_crypto.so...done. Loaded symbols for /usr/lib/stg/libstg_crypto.so Reading symbols from /usr/lib/stg/mod_store_mysql.so...done. Loaded symbols for /usr/lib/stg/mod_store_mysql.so Reading symbols from /usr/local/lib/mysql/libmysqlclient_r.so.16...done. Loaded symbols for /usr/local/lib/mysql/libmysqlclient_r.so.16 Reading symbols from /lib/libcrypt.so.4...done. Loaded symbols for /lib/libcrypt.so.4 Reading symbols from /lib/libz.so.4...done. Loaded symbols for /lib/libz.so.4 Reading symbols from /usr/lib/stg/mod_cap_netflow.so...done. Loaded symbols for /usr/lib/stg/mod_cap_netflow.so Reading symbols from /libexec/ld-elf.so.1...done. Loaded symbols for /libexec/ld-elf.so.1 #0 0x283dbfa0 in ?? () [New Thread 0x28401100 (LWP 100062)] (gdb) Еще заметил, что иногда остается процесс "stargazer: stg-exec (stargazer)"
-
А в скриптах OnConnect и OnDisconnect что ?
-
у меня тоже упал, только молча, не успев списать абонку.
-
Нашел причину постоянного падения stg-2.405.9.8 с модулем mysql_mutex-0.68_STG-WEB Ошибка закралась в функцию WriteDetailedStat sprintf(qbuf,"INSERT INTO detailstat_%02d_%4d SET login='%s', day=%d, startTime='%s', endTime='%s',", lt->tm_mon+1, lt->tm_year+1900, login.c_str(), lt->tm_mday, stTime.c_str(), endTime.c_str() ); int retRes; map<IP_DIR_PAIR, STAT_NODE>::const_iterator stIter; stIter = statTree->begin(); while (stIter != statTree->end()) { sprintf(param,"IP='%s', dir=%d, down=%lld, up=%lld, cash=%f, sess_id='%s'", inet_ntostr(stIter->first.ip), stIter->first.dir, stIter->second.down, stIter->second.up, stIter->second.cash, sessionID.c_str() ); strcat(qbuf,param); //Тут косяк printfd(__FILE__, "Query %s\n", qbuf); if( (retRes = MysqlQuery(qbuf)) ) { errorStr = "Couldn't insert data in WriteDetailedStat."; return MysqlReConnect(); } Переменные qbuf и param склеиваются, потом снова склеиваются и получается корявый запрос. (Только в случае, если в statTree больше 1 элемента.) Решил проблему следующим образом. -sprintf(qbuf,"INSERT INTO detailstat_%02d_%4d SET login='%s', day=%d, startTime='%s', endTime='%s',", - lt->tm_mon+1, lt->tm_year+1900, - login.c_str(), - lt->tm_mday, - stTime.c_str(), - endTime.c_str() - ); while (stIter != statTree->end()) { - sprintf(param,"IP='%s', dir=%d, down=%lld, up=%lld, cash=%f, sess_id='%s'", + sprintf(qbuf,"INSERT INTO detailstat_%02d_%4d SET login='%s', day=%d, startTime='%s', endTime='%s', IP='%s', dir=%d, down=%lld, up=%lld, cash=%f, sess_id='%s'", + lt->tm_mon+1, + lt->tm_year+1900, + login.c_str(), + lt->tm_mday, + stTime.c_str(), + endTime.c_str(), inet_ntostr(stIter->first.ip), stIter->first.dir, stIter->second.down, stIter->second.up, stIter->second.cash, sessionID.c_str() ); - strcat(qbuf,param); if( (retRes = MysqlQuery(qbuf)) ) { errorStr = "Couldn't insert data in WriteDetailedStat."; return MysqlReConnect(); }
-
2Alferov Так ведь не должно быть? При внесении средст с помощью конфигуратора в стг-веб "Статистика, история » Деньги" записи не отображаются При этом если вносить через stg_web то все ок. Stargazer в таблицу logs_%m_%y пишет. Из запроса SELECT count(a.unid) AS total FROM actions a LEFT JOIN users u ON a.login=u.login WHERE a.unid<>'' AND (a.time_stop>='2008-07-01 00:00:00' OR a.time_stop='0000-00-00 00:00:00') AND a.time_start<'2008-08-01 00:00:00' AND a.time_start>='2008-06-30 23:59:59' AND a.action LIKE 'pay_%' AND a.action != 'pay_credit_down' видно, что STG_WEB инфу о платежах берет из таблички `actions` в которую старгейзер ничего не пишет. Как бы это пофиксить?
