IDE Momentics - profiling. Настройка IDE QNX Momentics для исследования клиент-серверного приложения на локальной машине, страница 3

В начале запускается сервер, который создаёт 5 агентов, эти агенты посылают запрос серверу. После того как приходит запрос от клиента, сервер перенаправляет этот запрос на свободного агента или ставит его в очередь. На рисунке показана временная диаграмма взаимодействия клиент-сервер-агент.

На рисунке показаны 5 агентов и 6 клиентов. Видим, что вначале агенты инициализируются, посылая запросы серверу. После того как запускаются клиенты, и посылают запрос серверу, сервер перенаправляет эти запросы агентам. Но агентов только 5, а клиентов 6. И как мы видим, после обработки запросов, агенты через сервер возвращают клиентам ответ. Но запрос шестого клиента не обрабатывался, поэтому он не получает ответ. Когда агенты освободились, один из них начал обработку запроса шестого клиента, после этого через сервер, шестым клиентом был получен ответ.

Для проведения анализа системы используется утилита tracelogger. С помощью неё можно получить информацию о работе всех процессов в системе и их временные срезы.

Трассировку можно проводить либо начиная с какого то события, либо с момента запуска утилиты.

Рассмотрим запуск трассировки, которая начинается после запуска нашего сервера и заканчивается после того как закончится выполняться сервер. Для этого в код сервера нужно добавить специальные функции:

Serv.c

#include <sys/trace.h>

#include <sys/neutrino.h>

#include <stdio.h>

#include <stdlib.h>

#include "instrex.h"

int main(int argc, char **argv){

int                   rcvid, nbyte=255;

char           buf[255], chid_s[10];

pid_t chid ;

struct _msg_info* info;

// Функциидлязапускатрассировки

TRACE_EVENT(argv[0], TraceEvent(_NTO_TRACE_DELALLCLASSES));

TRACE_EVENT(argv[0], TraceEvent(_NTO_TRACE_CLRCLASSPID, _NTO_TRACE_KERCALL));

TRACE_EVENT(argv[0], TraceEvent(_NTO_TRACE_CLRCLASSTID, _NTO_TRACE_KERCALL));

TRACE_EVENT(argv[0], TraceEvent(_NTO_TRACE_CLRCLASSPID, _NTO_TRACE_THREAD));

TRACE_EVENT(argv[0], TraceEvent(_NTO_TRACE_CLRCLASSTID, _NTO_TRACE_THREAD));

TRACE_EVENT(argv[0], TraceEvent(_NTO_TRACE_SETALLCLASSESFAST));

TRACE_EVENT(argv[0], TraceEvent(_NTO_TRACE_ADDALLCLASSES));

// Сервер

chid = ChannelCreate( 0 );

if( fork() == 0 ){

// child process

itoa( chid, chid_s, 10 );

if( execl( "client", "child", chid_s, NULL ) == -1 )

printf("Execute child process is fail !\n ");

exit( EXIT_SUCCESS );

}

// parent process

rcvid = MsgReceive( chid, buf, nbyte, info );

if( rcvid > 0 ){

// Message

printf( "SERVER tell with you!!!\n  Server get msg = %s\n", buf );

if( MsgReply( rcvid, 0, "Server get msg!", nbyte ) == -1 )

printf("SERVER???\n  Don't Reply message to client\n");

}

// Остановкатрассировки

TRACE_EVENT(argv[0], TraceEvent(_NTO_TRACE_START));

return (0);

}

Запуск трассировки:

В начале запускаем утилиту tracelogger в режиме ожидания

#tracelogger –ld –f log

После этого запускаем приложение

#./serv

После выполнения приложения появится файл log

Для того, чтобы прочитать этот файл нужно воспользоваться утилитой traceprinter, но в этом файле находится информация о всех выполняемых процессах в системе, по этому отфильтруем информацию по pid нашего сервера:

#traceprinter –f log | grep 860201 > file_log

File_log

pid:860201

t:0xd7fae8b6 CPU:00 THREAD  :THCREATE      pid:860201 tid:1

t:0xd7fae9fe CPU:00 THREAD  :THRUNNING     pid:860201 tid:1

ppid:860201

t:0xd7fb3d9a CPU:00 THREAD  :THDESTROY     pid:860201 tid:1

t:0xd7fb4292 CPU:00 THREAD  :THDEAD        pid:860201 tid:1

t:0xd9dc99d6 CPU:00 THREAD  :THCREATE      pid:860201 tid:1

t:0xd9dc9ffa CPU:00 THREAD  :THREADY       pid:860201 tid:1

t:0xd9dca196 CPU:00 THREAD  :THRUNNING     pid:860201 tid:1

t:0xd9ddc522 CPU:00 THREAD  :THREPLY       pid:860201 tid:1

t:0xd9de0e5a CPU:00 COMM    :REPLY_MESSAGE tid:1 pid:860201

t:0xd9de1192 CPU:00 THREAD  :THREADY       pid:860201 tid:1

t:0xd9ec74e2 CPU:00 THREAD  :THRUNNING     pid:860201 tid:1

t:0xd9ecbed6 CPU:00 THREAD  :THREPLY       pid:860201 tid:1

t:0xd9ecec2e CPU:00 COMM    :REPLY_MESSAGE tid:1 pid:860201

t:0xd9ecef3e CPU:00 THREAD  :THREADY       pid:860201 tid:1

t:0xda15a39a CPU:00 THREAD  :THRUNNING     pid:860201 tid:1

t:0xda15e0ce CPU:00 THREAD  :THREPLY       pid:860201 tid:1

t:0xda160ca2 CPU:00 COMM    :REPLY_MESSAGE tid:1 pid:860201

t:0xda160fb2 CPU:00 THREAD  :THREADY       pid:860201 tid:1

t:0xda602162 CPU:00 THREAD  :THRUNNING     pid:860201 tid:1

t:0xda659bb2 CPU:00 THREAD  :THDESTROY     pid:860201 tid:1

t:0xda659f3e CPU:00 THREAD  :THDEAD        pid:860201 tid:1

t:0xdcdde7d2 CPU:00 PROCESS :PROCDESTROY   ppid:860201 pid:864298

t:0xdcdecf56 CPU:00 PROCESS :PROCDESTROY   ppid:548903 pid:860201