Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / раз в 9 часов вылетает ошибка. / 16 сообщений из 16, страница 1 из 1
06.04.2017, 08:02
    #39433888
Mari.P
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
раз в 9 часов вылетает ошибка.
Дано: Linux Debian 8.3, gcc-4.9
прога, обменивающаяся с узлами учета по протоколу UDP и складывающая результаты обмена в БД MySQL.
использую pthread
в минуту примерно 60 дочерних потоков создаются, отрабатывают и завершаются.
Проблема: примерно раз в 9 часов выскакивает ошибка при создании очередного потока pthread_create:
Дочерний поток пользуется структурой, передаваемой ему основным потоком только для чтения, данные не изменяет,
разве что один флаг tmp->live_thread=false;, когда завершается функцией pthread_exit(0);.
Подскажите плиз уважаемые профессионалы, куда копать в плане отладки?



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
                  sprintf(buffer,"main: Create new thread for: %s recv_len=%d",inet_ntoa(client_addr.sin_addr),recv_len);
                  debug_print(buffer);
                  tmp = (struct SessionThread *)malloc (sizeof (struct SessionThread));
                  INIT_LIST_HEAD(&tmp->list);
                  tmp->flag_new_packet=true;
                  tmp->recv_len=recv_len;
                  sprintf(buffer1,"");
                  sprintf(buffer,"");
                  for(i=0;i<tmp->recv_len;i++)
                   { byte_read=recv_buff[i];
                     tmp->recv_buff[i]=byte_read;
                     sprintf(buffer1," 0x%02X",byte_read);
                     strcat(buffer,buffer1);
                   }
                  debug_print(buffer);
                  memcpy(&tmp->client_addr1,&client_addr,sizeof(struct sockaddr_in));
                  tmp->ptrdb=&dbinf;
                  tmp->live_thread=true;   // current thread is end;
                  tmp->bKill=false;         // signal from main to  thread to end work;
                  tmp->sockfd=sockfd;
                  list_add(&(tmp->list), &(Sessionlist.list));
                  thread_data=tmp;
                  status=pthread_create(&tmp->thread, NULL, threadFunc, thread_data);
                  if(status!=SUCCESS)
                  {   sprintf(buffer,"main error: can't create thread for: %s",inet_ntoa(client_addr.sin_addr));
                      debug_print(buffer);
                      tmp->live_thread=false;   // current thread is end;
                        // Clean the list from the end of sessions
                     list_for_each_safe(pos, q, &Sessionlist.list)
                    {
                     tmp = list_entry(pos, struct SessionThread, list);
                     if(tmp->live_thread==false)
                    {  sprintf (buffer,"main: freeing item %s ", inet_ntoa(tmp->client_addr1.sin_addr));
                        debug_print(buffer);
                        list_del(pos);
                        free (tmp);
                   }
              }// end loop for the list/////////////////////////////////////////////////////////////////////////////////////
             } // if(status!=SUCCESS)
                  sprintf(buffer,"main: thread=%d is created for: %s",tmp->thread,inet_ntoa(client_addr.sin_addr));
                  debug_print(buffer);
...
Рейтинг: 0 / 0
06.04.2017, 09:20
    #39433923
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
раз в 9 часов вылетает ошибка.
Mari.PПодскажите плиз уважаемые профессионалы, куда копать в плане отладки?
Ошибку посмотреть для начала. Если проблема тут
Код: plaintext
1.
2.
                  status=pthread_create(&tmp->thread, NULL, threadFunc, thread_data);
                  if(status!=SUCCESS)


То смотреть что в status записалось.
...
Рейтинг: 0 / 0
06.04.2017, 09:25
    #39433926
Mari.P
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
раз в 9 часов вылетает ошибка.
Dima T, Да, спасибо, добавила в код печать кода ошибки в лог. Жду....
...
Рейтинг: 0 / 0
06.04.2017, 09:38
    #39433935
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
раз в 9 часов вылетает ошибка.
Если ошибка очень редко происходит, то есть смысл понавставлять запись в лог во все подозрительные места, чтобы потом можно было понять что предшествовало ошибке.
...
Рейтинг: 0 / 0
06.04.2017, 11:14
    #39434015
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
раз в 9 часов вылетает ошибка.
Скорее всего в какой-то момент потоки подвисают, а новые потоки продолжают создаваться и расходовать ресурсы.
А потом заканчивается память или какие-нибудь дескрипторы.

Ведите учет кол-ва потоков и печатайте его.

9 часов по 60 потоков в минуту это примерно 32К потоков. Степени двойки это всегда подозрительные числа )))
...
Рейтинг: 0 / 0
06.04.2017, 11:15
    #39434017
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
раз в 9 часов вылетает ошибка.
Mari.Pкуда копать в плане отладки?
Утечки памяти и других ресурсов. valgrind в руки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
06.04.2017, 11:24
    #39434022
Mari.P
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
раз в 9 часов вылетает ошибка.
Dima T, Написала прогу-эмулятор узла учета и запустила со 100 точек одновременно.

Через час сервер вылетел на функции
Код: plaintext
1.
pthread_create 

с кодом ошибки 11 (EAGAIN)
Вообще ничего не понимаю... Одновременно у меня не более 20 открытых сессий (стоит ограничение)
Поток завершается
Код: plaintext
1.
 pthread_exit(0);


Или я неправильно завершаю, надо еще в main что-то передавать, чтобы головной поток знал о завершении дочернего?
Подскажите плиз уважаемые профессионалы.
...
Рейтинг: 0 / 0
06.04.2017, 11:38
    #39434038
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
раз в 9 часов вылетает ошибка.
Не силен в линуксах. Вот что нагуглилось
http://stackoverflow.com/questions/8634736/pthread-create-and-eagain Okay, found the answer. Even if pthread_exit or pthread_cancel is called, the parent process still need to call pthread_join to release the pthread ID, which will then become recyclable.

Putting a pthread_join(tid, NULL) in the end did the trick.

Как понимаю надо pthread_join() для ожидания завершения потока или pthread_detach() чтобы сообщить ОС что ожидания не будет.

Добавь pthread_detach() после создания потока.
...
Рейтинг: 0 / 0
06.04.2017, 11:50
    #39434052
Mari.P
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
раз в 9 часов вылетает ошибка.
Код: plaintext
1.
pthread_join 

мне не нужен, головной поток совсем не ждет завершения дочернего, он принимает пакеты и раскидывает их по дочерним потокам по IP-адресу, или создает новый поток, если IP-адреса нет в списке работающих потоков.
В свою очередь дочерний поток спрашивает все, что ему нужно с данного IP и завершается
Код: plaintext
1.
pthread_exit(0)

А вот про
Код: plaintext
1.
pthread_detach 

сейчас почитаю. Спасибо!
...
Рейтинг: 0 / 0
06.04.2017, 12:17
    #39434080
Mari.P
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
раз в 9 часов вылетает ошибка.
Да, конечно, надо было так писать, иначе main считает потоки, на зная, что они завершились и прекращает их создавать по достижению числа X. Переделала, запустила на проверку...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 
// thread settings
 pthread_attr_t threadAttr; 
 pthread_attr_init(&threadAttr); 
 pthread_attr_setdetachstate(&threadAttr, PTHREAD_CREATE_DETACHED); 

..........................................

status=pthread_create(&tmp->thread, &threadAttr, threadFunc, thread_data);
...
Рейтинг: 0 / 0
06.04.2017, 13:27
    #39434142
ROLpogo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
раз в 9 часов вылетает ошибка.
Mari.PДа, конечно, надо было так писать, иначе main считает потоки, на зная, что они завершились и прекращает их создавать по достижению числа X. Переделала, запустила на проверку...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 
// thread settings
 pthread_attr_t threadAttr; 
 pthread_attr_init(&threadAttr); 
 pthread_attr_setdetachstate(&threadAttr, PTHREAD_CREATE_DETACHED); 

..........................................

status=pthread_create(&tmp->thread, &threadAttr, threadFunc, thread_data);



Пацаны, вы тоже это видите?
Пойду я, пожалуй, борщ варить.
...
Рейтинг: 0 / 0
07.04.2017, 05:05
    #39434515
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
раз в 9 часов вылетает ошибка.
ROLpogoПойду я, пожалуй, борщ варить.я ещё вчера уже котлеты пожарил, постирался и пропылесосил.
...
Рейтинг: 0 / 0
07.04.2017, 11:14
    #39434646
Mari.P
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
раз в 9 часов вылетает ошибка.
ROLpogo, CEMb, вы ошиблись сайтом, ваш форум тут http://forum.domohozyaika.com/ , там как раз есть раздел "о компьютерах"...
...
Рейтинг: 0 / 0
07.04.2017, 11:18
    #39434648
д0kХ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
раз в 9 часов вылетает ошибка.
Mari.P с кодом ошибки 11 (EAGAIN)

Вообще ничего не понимаю...

Подскажите плиз уважаемые профессионалы.

Вобще то это офтопик
но
для понимания причин нужно видеть в ОС

vmstat 1 100

во время возникновения ошибки.

С очень большой вероятностью в момент возникновения ошибки
1 и 2 колонки будут равны , или вторая больше первой .

Первая колонка никогда не может быть больше количества ядер ( * хипертрединг)

В идеально сбалансированной и оттюниной под приложение ОС
вторая колонка должна быть равна 0,
а числа больше нуля могут появляться при значения меньше 20 в 15 колонке (id)
это когда общая нагрузка на все процессоры больше 80%.

Из других колонок vmstat с высокой долей вероятности можно
будет выяснить причину.
...
Рейтинг: 0 / 0
07.04.2017, 11:26
    #39434660
Mari.P
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
раз в 9 часов вылетает ошибка.
д0kХ, ответ мне вчера подсказал Dima T , а конкретика здесь:
https://www.linux.org.ru/forum/development/6735812
сейчас уже почти сутки все работает без сбоев.
...
Рейтинг: 0 / 0
07.04.2017, 11:34
    #39434669
д0kХ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
раз в 9 часов вылетает ошибка.
Mari.Pд0kХ, ответ мне вчера подсказал Dima T , а конкретика здесь:
https://www.linux.org.ru/forum/development/6735812
сейчас уже почти сутки все работает без сбоев.


А теперь вы можете смотреть в хрустальный шар vmstat
и по значениям больше 0 в второй колоне предсказывать скорое
появление EAGAIN в вашем приложении
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / раз в 9 часов вылетает ошибка. / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]