영상플랫폼구조개선적용기술 2015/06/05 엠앤엘솔루션
부하분산 지정된특정포트로 스트리밍 하는의부하분산방법으로전처리클로닝 & 소켓이관 1) listen 2) connect 3) accept 2) connect 3) accept 1) listen handover ( ufd, void *ptr, size_t nbytes, fd, char *path) struct sockaddr_un sun; val; struct msghdr msg; struct iovec vec; union struct cmsghdr cm; char control[cmsg_space(sizeof())]; control_un; 5) close struct cmsghdr *cmptr; 4) forking sun.sun_family = AF_UNIX; strcpy(sun.sun_path, path); 4) h/o msg.msg_name msg.msg_namelen = &sun; = sizeof(sun); 서비스별 forking하는구조로서자원소모가많음 ( 전체복사 ; 메모리, CPU) 시간지연요소발생 w/ Unix domain Socket 사전에미리생성적절한분배규칙에의해분산연결된소켓정보를이관 vec.iov_base = ptr; vec.iov_len = nbytes; msg.msg_iov = &vec; msg.msg_iovlen = 1; msg.msg_control = control_un.control; msg.msg_controllen = sizeof(control_un.control); msg.msg_flags = 0; cmptr = CMSG_FIRSTHDR(&msg); cmptr->cmsg_level = SOL_SOCKET; cmptr->cmsg_type = SCM_RIGHTS; cmptr->cmsg_len = CMSG_LEN(sizeof()); *(( *) CMSG_DATA(cmptr)) = fd; return(sendmsg(ufd, &msg, 0));
프로세스경량화를통한고용량시스템 가입자서비스단위별프로세스생성방식에서그룹별프로세스생성 / 관리, 동일자원대비고집적구현 해시함수 #define HashIsp(d,x) #define HashOsp(d,x) (atoi(&(d)[0]+ter_id_len-4)%x) (atoi(&(d)[0]+ter_id_len-4)%x) instream outstream ter_id ter_token user_id user_token 그룹그룹그룹 가입자서비스별로프로세스를생성하므로자원을많이소모하고에관리 / 분배역할집중, 가재기동할경우이전의프로세스를관리할수없음. 가입자와관련된키 (KEY) 를기반으로분배, 는빠르게부하분산에집중최소한의관리정보를취하고그룹에서관리재기동이후관리가능는그룹의쉘 (SHELL) 로동작하며, 그룹프로세스의이상상황감지시재기동작업을수행 ISA OSA 영속성 VOC ter_id ter_token user_id user_token mac RTSP URL 내부세션관리를위한호환키로서 ter_id 고객응대관련키로 user-id mac 사용
실시간자료색인및검색속도개선 메모리, 오픈해시기반빠른검색 #define sockhashfunc(d) ((d) % MAX_HASH) #define keyhashfunc(d,l) (atoi(&(d)[0]+l-4)%max_hash) typedef struct pthread_mutex_t lock; X X X X 환형큐방식의 linked-list 구조체사용 Pending 자료 ( 대부분대기열소켓 ) 가많아질경우급격한성능저하발생 X X X X X X X X 해시 array 에 linked-list 를연결한방식 해시함수를이용, 적절히분배하면 O(1) 검색속도 예 ) array 크기가 256 개에 linked-list depth 가 4 이면 1024 가입자의빠른검색이가능, 자원손실최소 u8_t priv[0]; u8_t mac [MAC_LEN+4]; u8_t ter_id [TER_ID_LEN+4]; u8_t ter_token [TER_TOKEN_LEN+4]; u32_t user_id; u8_t user_token [USER_TOKEN_LEN+4]; char url[short_url_len+4]; // URL char sdp[bufsiz]; // SDP retry; up_bytes; up_packets; dn_bytes; dn_packets; struct list_head til; // ter_id struct list_head ttl; // ter_token struct list_head uil; // user_id struct list_head utl; // user_token struct list_head csl; // control socket struct list_head ssl; // stream socket struct list_head rsl; // relay socket struct list_head tsl; // trigger socket 적용된 linked-list 기법은 Linux 커널에서사용 검증된 list.h 사용 sockh_t *csock; sockh_t *ssock; sockh_t *rsock; sockh_t *tsock; keyh_t; // 자료예시 // control // stream // relay (ISP <-> OSP) // trigger (EB)
효율적인타이머기술적용 주기적작업, 재전송등의작업에효율적인전역타이머적용 에서의 Keep-alive / call-check 구현예시 ) 프로세스 timer #define MAXCB 10 void cbfn(char* d) struct timeb t; ftime(&t); prf("%d.%03d : (-) %s \n",t.time,t.millitm,d); worker worker 컨텍스트데이터 프로세스별타이머존재, worker thread 는모든메시지의시각을 timer 컨텍스트에남기고, 타이머가무한루프를돌면서 현재의시각과비교하는방식으로구현 X X X X 타이머등록 ( 콜백함수, expired time/msec) 타이머등록 ( 콜백소켓, 데이터, expired time/msec) 프로세스 독립적인타이머 thread 존재, 등록함수에따라 timer 가직접콜백함수를실행 또는콜백소켓으로데이터를만료시간에전달해줌 최적성능을위하여등록시, 만료시간을기준으로 Sorting 하고 timer thread 가일정주기로 wake 하여 현재시간이전작업을순차적으로처리 main() tid[maxcb],i; char p[maxcb][20]; struct timeb t; for(i=0;i<maxcb;i++) ftime(&t); sprf(p[i],"hello-%02d",i); tid[i] = set_cb_timeout (cbfn, p[i],1000*(i+1)); prf("%d.%03d : (+) %s (callback after %7.3f sec)\n", t.time,t.millitm,p[i],(float)1000*(i+1)/1000); while(1) sleep(1);
인터페이스추상화모델및개발관리방안제시 스트리밍구성요소인 inbound/outbound streamer 인터페이스추상화제시 ISP ISA ISP ISA OSP OSA 공통모듈 ( 라이브러리 ) 각프로세스파일구조 ( 모두동일 ) main.c 메인함수 init.c 초기화및종료관련 ( 자료형 /DB/ 로그 / 환경설정 / 시그널관리 ) cock.c 논리코드 ( 소켓관련처리 ) command.c 커맨드, 명령어처리관련 Fsm.h 유한상태기계 (Finite State Machine) 정의및콜백함수지정 config.c 환경설정수행부 config.h 환경설정정의 OSA OSP 재사용가능공통모듈없음개발방법론부재에따른프로그램가독성떨어짐 실제각프로세스는대부분논리코드만존재, 작업의대부분을공용화하여라이브러리화 전체스트리머의인터페이스추상화모델개발 / 구현 제어 (control) 스트리밍 (streaming) C S 서비스요청 (trigger) T 인터페이스모델 U R 릴레이 (ISP/OSP) (relay) ISP/ISA 통신 (UNIX domain socket) 라이브러리구성 db.c 데이터베이스 ODBC wrapper/api 함수 hash.c/h 스트리밍관련해시함수 list.h 리눅스커널함수를사용자스페이스로포팅 cctv.c/h CCTV 관련 API/ 라이브러리 rtsp.c/h RTSP 관련클라이언트 / API 함수 timefmt.c/h 각종시각포맷변환함수 sock.c/h 소켓관련 API 함수 seed.c/h 암호화관련함수 premmc.c / mmc.c 커맨드라인기반명령어처리파서 / 함수 rc.c/h 자원관리함수 proc.c/h 프로세스관리함수 log.c/h 로그 /TLO 관련함수 util.h 각종매크로유틸리티
fsm (finite state machine) 을적용한상태천이관리 복잡한논리단계를코드에쉽게적용가능 유한상태관리기자료형 : 특정상태에서이벤트를수신하면해당콜백함수가수행되는구조 클래스기반의복잡한논리구조로설계구현각메시지별로클래스정의기능단위별로워크 thread가작성되어있으므로, IPC ( 각객체 / 클래스 / 별로고유의메시지큐및내부버퍼를사용 ) 의단계가복잡하고지연요소가발생 협상메시지송 / 수신기반시스템에서유한상태기계를사전에정의하고, 상태와이벤트에의해서수행할작업 (action) 과상태천이를수행하도록설계 / 구현함 typedef struct status; event; (*cbfunc)(void*, void*); next; fsm_t; ISP/OSP 에서 Relay negotiation 하는유한상태기계자료정의 static fsm_t rfsm[] = ; OPEN, UP, cbsendtypereq, SENT(REQ(SEND_TYPE)), SENT(REQ(SEND_TYPE)), RCVD(RES(SEND_TYPE)), NULL, RCVD(RES(SEND_TYPE)), RCVD(RES(SEND_TYPE)), RCVD(REQ(SDP)), cbusertokenreq, SENT(REQ(USER_TOKEN)), SENT(REQ(USER_TOKEN)), RCVD(RES(USER_TOKEN)), NULL, RCVD(RES(USER_TOKEN)), RCVD(RES(USER_TOKEN)), RCVD(REQ(STRM_START)), cbstartstrmresp, ESTABLISH, RCVD(REQ(STRM_START)), cbstartstrmresp, ESTABLISH, ESTABLISH, RCVD(REQ(STRM_STOP)), cbstopstrmresp, ESTABLISH, 0, 0, NULL, 0 ESTABLISH,