Помогите найти утечку ресурсов
От: QC  
Дата: 23.09.06 16:59
Оценка:
Добрый день, нужна помощь в устранении следующей проблемы.

ОС Linux Fedora 2.6

Программа читает файловый дескриптор /dev/serial/chan0, обрабатывает полученные данные
и пишет "ответы" в этот дескриптор. Все это выполняется в бесконечном цикле while (см код).

Программа работает нормально примерно несколько (по разному) тысяч циклов while, после чего ни с того ни с сего
в этом цикле появляются ощутимые задержки длительностью несколько сот микросекунд. Есть подозрение, что
"забивается" стек CPU или еще какие-то системные ресурсы. Программа может работать бесконечно, но из-за
задержек теряется часть данных принимаемых из файлового дескриптора.

CPU LOAD < 1%, память вроде бы не растет, valgrind утечек не находит. На работе других программ задержки
не сказываются. Абсолютно точно известно, что данные извне в файловый дескриптор поступают без задержек.

Программа использует pthreads но ВСЕ они создаются PTHREAD_CREATE_DETACHED.

Причина видимо в THREAD_FUNC, но как дочерняя нить может КАК-ЛИБО влиять на родительский поток ?

Буду благодарен за подсказку где искать проблему.



struct MESSAGE
{
 ssize_t    LEN; // NUMBER OF BYTES IN DATA
 u_char     DATA[1000];

 ~MESSAGE(); // DESTRUCTOR
};

void main()
{
 ssize_t nrx=0; u_char buffer[50]={0};

 int chan = open("/dev/serial/chan0", O_RDWR);

 MESSAGE MSG_BUF;

 if (chan > 0) 
 {
  while (true)
  {
   nrx = read (chan, buffer, 50);

   memcpy (MSG_BUF.DATA, buffer, nrx); MSG_BUF.LEN=nrx;

   START_PROC(&MSG_BUF);  ... ЭТА ПРОЦЕДУРА СОЗДАЕТ ЗАДЕРЖКИ ???!!! ... 
 
  }
 } 
}

void START_PROC(void *arg)
{

 pthread_attr_t attr_PRC; pthread_t tid_PRC; sched_param param_PRC;
 pthread_attr_init(&attr_PRC); param_PRC.__sched_priority=99; 
 pthread_attr_setschedparam  (&attr_PRC, &param_PRC);
 pthread_attr_setschedpolicy (&attr_PRC, SCHED_RR);
 pthread_attr_setdetachstate (&attr_PRC, PTHREAD_CREATE_DETACHED);

 pthread_create (&tid_PRC, &attr_PRC, THREAD_FUNC, arg); 
}

void *THREAD_FUNC(void *arg)
{
 ... PROCESS DATA AND WRITE RESPONSE ...
}

Добавлено форматирование — Кодт


27.09.06 16:40: Перенесено из 'C/C++'
Re: Помогите найти утечку ресурсов
От: MaximE Великобритания  
Дата: 23.09.06 19:31
Оценка:
QC wrote:

> Добрый день, нужна помощь в устранении следующей проблемы.

>
> ОС Linux Fedora 2.6
>
> Программа читает файловый дескриптор /dev/serial/chan0, обрабатывает
> полученные данные
> и пишет "ответы" в этот дескриптор. Все это выполняется в бесконечном
> цикле while (см код).
>
> Программа работает нормально примерно несколько (по разному) тысяч
> циклов while, после чего ни с того ни с сего
> в этом цикле появляются ощутимые задержки длительностью несколько сот
> микросекунд. Есть подозрение, что
> "забивается" стек CPU или еще какие-то системные ресурсы. Программа
> может работать бесконечно, но из-за
> задержек теряется часть данных принимаемых из файлового дескриптора.
>
> CPU LOAD < 1%, память вроде бы не растет, valgrind утечек не находит. На
> работе других программ задержки
> не сказываются. Абсолютно точно известно, что данные извне в файловый
> дескриптор поступают без задержек.
>
> Программа использует pthreads но ВСЕ они создаются PTHREAD_CREATE_DETACHED.
>
> Причина видимо в THREAD_FUNC, но как дочерняя нить может КАК-ЛИБО влиять
> на родительский поток ?

> struct MESSAGE
> {
> ssize_t LEN; // NUMBER OF BYTES IN DATA
> u_char DATA[1000];
> 
> ~MESSAGE(); // DESTRUCTOR
> };
> 
> void main()
> {
> ssize_t nrx=0; u_char buffer[50]={0};
> 
> int chan = open("/dev/serial/chan0", O_RDWR);
> 
> MESSAGE MSG_BUF;
> 
> if (chan > 0)
> {
> while (true)
> {
> nrx = read (chan, buffer, 50);
> 
> memcpy (MSG_BUF.DATA, buffer, nrx); MSG_BUF.LEN=nrx;
> 
> START_PROC(&MSG_BUF); ... ЭТА ПРОЦЕДУРА СОЗДАЕТ ЗАДЕРЖКИ ???!!! ...
> 
> }
> }
> }
> 
> void START_PROC(void *arg)
> {
> 
> pthread_attr_t attr_PRC; pthread_t tid_PRC; sched_param param_PRC;
> pthread_attr_init(&attr_PRC); param_PRC.__sched_priority=99;
> pthread_attr_setschedparam (&attr_PRC, &param_PRC);
> pthread_attr_setschedpolicy (&attr_PRC, SCHED_RR);
> pthread_attr_setdetachstate (&attr_PRC, PTHREAD_CREATE_DETACHED);
> 
> pthread_create (&tid_PRC, &attr_PRC, THREAD_FUNC, arg);
> }
> 
> void *THREAD_FUNC(void *arg)
> {
> ... PROCESS DATA AND WRITE RESPONSE ...
> }


Немного необычно ты читаешь данные. read() возвращает не столько, сколько ты
указал (50), а столько сколько было доступно, или блокирует поток. пока не
доступен хотя бы один байт. Если данные читаются по-малу, но часто, не сложно
переусердствовать с созданием потоков на каждый чих.

Твой поток риал-таймовый, что означает, если процессоров на машине меньше чем
риалтаймовыйх потоков, все остальные обычные потоки/процессы будут голодать,
пока риалтаймовые потоки не заблокируются на системном вызове или не заваершат
свою работу. Хотя, скорее, у тебя проблема в коде, который ты не привел.

--
Maxim Yegorushkin

No Microsoft product was used in any way to write or send this text.
If you use a Microsoft product to read it, you're doing so at your own risk
Posted via RSDN NNTP Server 2.0
Re: Помогите найти утечку ресурсов
От: MaximE Великобритания  
Дата: 23.09.06 20:09
Оценка:
QC wrote:
[]

> struct MESSAGE
> {
> ssize_t LEN; // NUMBER OF BYTES IN DATA
> u_char DATA[1000];
> 
> ~MESSAGE(); // DESTRUCTOR
> };
> 
> void main()
> {
> ssize_t nrx=0; u_char buffer[50]={0};
> 
> int chan = open("/dev/serial/chan0", O_RDWR);
> 
> MESSAGE MSG_BUF;
> 
> if (chan > 0)
> {
> while (true)
> {
> nrx = read (chan, buffer, 50);
> 
> memcpy (MSG_BUF.DATA, buffer, nrx); MSG_BUF.LEN=nrx;
> 
> START_PROC(&MSG_BUF); ... ЭТА ПРОЦЕДУРА СОЗДАЕТ ЗАДЕРЖКИ ???!!! ...
> 
> }
> }
> }


Не приметил, когда писал другое сообщение, что MSG_BUF у тебя на стэке. Данные
могут затираться в тот самый момент, когда они обрабатыватся другим потоком.
Похоже, что поток, который делает read() — SCHED_OTHER, а который обрабатывает —
SCHED_RR — риал-тайм, потому первый поток блокируется, когда другой выполняется,
и не может затереть данные, пока другой поток эти данные обрабатывает.

--
Maxim Yegorushkin

No Microsoft product was used in any way to write or send this text.
If you use a Microsoft product to read it, you're doing so at your own risk
Posted via RSDN NNTP Server 2.0
Re[2]: Помогите найти утечку ресурсов
От: Аноним  
Дата: 23.09.06 22:27
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Не приметил, когда писал другое сообщение, что MSG_BUF у тебя на стэке. Данные

ME>могут затираться в тот самый момент, когда они обрабатыватся другим потоком.
ME>Похоже, что поток, который делает read() — SCHED_OTHER, а который обрабатывает —
ME>SCHED_RR — риал-тайм, потому первый поток блокируется, когда другой выполняется,
ME>и не может затереть данные, пока другой поток эти данные обрабатывает.


Понял, спасибо, в воскресенье проверю. Странно тем не менее, что первые принятые несколько тысяч пакетов с момента
запуска приложения обрабатываются без задержек, а затем даже одиночный пакет генерит до 600 мс. Что-то копится.
Упрощу и приведу весь код здесь.
Re[3]: Помогите найти утечку ресурсов
От: mr_jek  
Дата: 24.09.06 11:52
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Понял, спасибо, в воскресенье проверю. Странно тем не менее, что первые принятые несколько тысяч пакетов с момента

А>запуска приложения обрабатываются без задержек, а затем даже одиночный пакет генерит до 600 мс. Что-то копится.
А>Упрощу и приведу весь код здесь.

лучше valgrind поставь.
Re[2]: Помогите найти утечку ресурсов
От: QC  
Дата: 24.09.06 21:03
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Не приметил, когда писал другое сообщение, что MSG_BUF у тебя на стэке. Данные

ME>могут затираться в тот самый момент, когда они обрабатыватся другим потоком.
ME>Похоже, что поток, который делает read() — SCHED_OTHER, а который обрабатывает —
ME>SCHED_RR — риал-тайм, потому первый поток блокируется, когда другой выполняется,
ME>и не может затереть данные, пока другой поток эти данные обрабатывает.

Да, так оно и есть . Получается, что поток SCHED_RR с минимальным приоритетом = 1, имеет
больший приоритет чем поток SCHED_OTHER ?
Спасибо !
Re[3]: Помогите найти утечку ресурсов
От: MaximE Великобритания  
Дата: 24.09.06 22:00
Оценка:
QC wrote:

> ME>Не приметил, когда писал другое сообщение, что MSG_BUF у тебя на

> стэке. Данные
> ME>могут затираться в тот самый момент, когда они обрабатыватся другим
> потоком.
> ME>Похоже, что поток, который делает read() — SCHED_OTHER, а который
> обрабатывает —
> ME>SCHED_RR — риал-тайм, потому первый поток блокируется, когда другой
> выполняется,
> ME>и не может затереть данные, пока другой поток эти данные обрабатывает.
>
> Да, так оно и есть . Получается, что поток SCHED_RR с минимальным
> приоритетом = 1, имеет больший приоритет чем поток SCHED_OTHER ?

Верно. SCHED_FIFO и SCHED_RR — риал-таймовые политики, такие потоки всегда
вытесняют любые SCHED_OTHER потоки.

Похоже, что хоть ты и создавал потоки для каждого куска данных, эти потоки
вытесняли поток чтения, т.е. на однопроцессорной машине схема работает совсем
как если бы ты обрабатывал данные в том же самом потоке, в каком читаешь. Может
быть стоит подумать о том, чтобы использовать nonblocking/async io, т.к. у тебя
на практике один поток успевает прочесть и обработать данные?

--
Maxim Yegorushkin

No Microsoft product was used in any way to write or send this text.
If you use a Microsoft product to read it, you're doing so at your own risk
Posted via RSDN NNTP Server 2.0
Re[4]: Помогите найти утечку ресурсов
От: MaximE Великобритания  
Дата: 24.09.06 22:10
Оценка:
mr_jek wrote:

> А>Понял, спасибо, в воскресенье проверю. Странно тем не менее, что

> первые принятые несколько тысяч пакетов с момента
> А>запуска приложения обрабатываются без задержек, а затем даже одиночный
> пакет генерит до 600 мс. Что-то копится.
> А>Упрощу и приведу весь код здесь.
>
> лучше valgrind поставь.

valgrind — отличный инструмент, сам пользую.

Единственная проблема — быстродействие. Синтетический cpu valgring работает, по
их утверждению, в 50 раз медленнее твоего железного процессора, поэтому,
например, valgrind'ом невозможно отловить в сервере ошибку, которая
воспроизводится только под большой нагрузкой. В общем случае, им сложно отловить
ошибки, связанные с таймингом, т.к. этот инструмент вносит громадное искажение
по времени, что называют probe effect.

--
Maxim Yegorushkin

No Microsoft product was used in any way to write or send this text.
If you use a Microsoft product to read it, you're doing so at your own risk
Posted via RSDN NNTP Server 2.0
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.