В начале запускается сервер, который создаёт 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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.