EzDoum

찾기
처음으로 | 찾기 | 아카이브 | 글 올리기 | 링크 | 자료실 | 통계 | 연락처 | 자유게시판
이지도움 특집
전체보기
네트워크
TI OMAP35x
TI DaVinci
Analog Blackfin
RobotWar2005
임베디드!
캐쉬의 모든것
메모리 할당 알고리즘
CPU 파이프라이닝
자료구조(Tree)
금융

Login
이름

암호

기억하기


사용자 등록

현재 접속중인 등록 사용자는 0명, 익명 사용자는 2명 입니다.
전체 등록 사용자: 751명

마지막 답장
·libcurl + fuse 조합으로 되는게 많네. (1)
·Linux Ftrace에 관해 (3)
·Android MTP ( Media Transfer Protocol ) (1)
·Lighttpd에 인증을 digest 사용시 IE 오동작 문제? (1)
·Dtrace에 관해 (1)

최근글
·OpenSSL and multi-threads (0)
·ARM 환경에서 OpenCL 사용 (0)
·IoT용 WIFI 모듈 비교 ( MCU ) 클래스 (0)
·Glances - 리눅스 여러 가지 항목을 한 화면에서 모니터링 (0)
·plugin 방식의 로그 분석기 (0)

뜨거운 감자
·나는 인터렉티브한 환경에서 역어셈블 한다. (12)
·GNU REGEX (정규표현식) 프로그래밍 강좌 (7)
·SoCRobotWar 2005 - 신입생 기초 교육자료 (7)
·ASP.NET의 데이터 그리드와 사용자 컨트롤 (7)
·DHTML Editing Control (7)

가장 많이 읽은 글
·[Cache] 2-way Set-Associative 방식이란 무엇일까? (2)
·멀티쓰레드(Pthread) 프로그래밍
·GNU REGEX (정규표현식) 프로그래밍 강좌 (7)
·Sorting Algorithm Animation (2)
·SoCRobotWar 2005 - 신입생 기초 교육자료 (7)

PHP 새로운 요청 처리 방법
글쓴이: EzDoum 글쓴날: 2002년 12월 16일 오후 11:39
리눅스



연말에 흥미로운 프로젝트를 하나 했는데, 오늘 드디어 오픈을 했네요..
회사에서 한 프로젝트라 다 공개를 할수는 없지만,, 저와 비슷한 문제를 경험한
분들에게 해결책이 될듯해서... 일부를 공개 합니다... ^^

우선 문제의 시작은 2001년 초에 시작이 됐는데,
제가 만드는 서비스는 cgi형태로 제작이 되어야 했습니다.
(기존의 여러 라이브러리가 c로 제작되었고
db접속이 pro*c로 해야 했기 때문에...)
사용자가 적을때는 이 cgi가 별 무리 없이 동작을 했지만,
사용자가 몰리게 되면, 과도한 fork와 db쪽에 접속이 몰려서 시스템이
버텨내지를 못했습니다.

그래서, 이것저것 고민을 하다가 생각해 낸것이..
포크를 줄이기 위해서 아에 아파치 모듈로 서비스를 제작하자 였습니다.
아파치 모듈제작은 해야 할 일이 너무 많더군요...
(아파치 소스 분석이라던지, 기존의 cgi와 아파치 연동부분 등등..)

그러던 차에 fast-cgi란 넘을 알게 됐는데,
아파치 모듈로 만로 만드는 것 보다는 일이 덜 생겼지만, 개발은 여전히 C로 해야하고,
db접속이 몰리는 부분도 여전히 한계로 남았습니다.

여차여차해서... 시간은 한 1년정도 또 흘렀습니다.
그간에 만든것이.. 완전한 트렌잭션을 처리하는 미들웨어는 아니지만,
쓰레드풀과 요청을 버퍼링하고, 프로세스를 관리하는 정도의 플랫폼(?)이 구축이
되어서, 이 플렛폼과 웹을 연동하는 방법을 찾아 보게되었습니다.

역시 여러가지 아이디어가 있었지만, php익스텐션 제작으로 결론을 내렸습니다.
그렇게 판단된 이유는,,

1) php가 아파치 모듈로 탑재 되기 때문에, 포크가 없다.
2) 플랫폼간의 중계를 담당하는 라이브러리만 구축이 되면
php의 풍부한 여러 기능들을 사용할수 있다.
3) 업무로직과 웹개발쪽이 분리되어 개발 생산성을 높일수 있다.
4) 미들웨어 사용으로 인한 안정적인 서비스가 가능하다.

올해 초에 간단하게 테스트 버전으로 개발을 했다가
11월쯤에 이 기술을 적용 할 만한 프로젝트가 시작되어서
드디어 마무리가 되었네요..

만든 확장함수들이 대충 아래와 같은데,
크게 나누어 보면,,

통신을 관리하는 부분
패킷을 관리하는 부분
패킷을 조립하고 분해하는 부분..

PHP_FUNCTION(zeroin_alloc_packet); /* 할당 */
PHP_FUNCTION(zeroin_init_packet); /* 만들어 논거 리셋해서 다시 쓰기 */
PHP_FUNCTION(zeroin_make_packet); /* 포장 size등을 넣어서 포장하기 */
PHP_FUNCTION(zeroin_check_packet); /* 잘 만들어 졌는지 검사 */
PHP_FUNCTION(zeroin_dump_packet); /* 덤프 */
PHP_FUNCTION(zeroin_free_packet); /* 메모리 해제 */

PHP_FUNCTION(zeroin_open); /* conn G/W 접속 */
PHP_FUNCTION(zeroin_popen); /* conn G/W persistent 접속 */
PHP_FUNCTION(zeroin_close); /* conn G/W 접속종료 */
PHP_FUNCTION(zeroin_ping); /* conn G/W 살아있을까? 핑 */
PHP_FUNCTION(zeroin_send); /* conn, packet 패킷 전송 */
PHP_FUNCTION(zeroin_recv); /* conn, packet 패킷 응답받기 */
PHP_FUNCTION(zeroin_send_recv); /* conn, packet 트랜젝션 */

PHP_FUNCTION(zeroin_read_string); /* packet, offset, len -> rtn(string) */
PHP_FUNCTION(zeroin_read_int); /* packet, offset, len -> rtn(int) */
PHP_FUNCTION(zeroin_read_double); /* packet, offset, len, factor -> rtn(double) */
PHP_FUNCTION(zeroin_read_byte); /* packet, offset -> rtn(string) */
PHP_FUNCTION(zeroin_read_bool); /* packet, offset -> rtn(bool) */

PHP_FUNCTION(zeroin_write_string); /* packet, offset, printf , value*/
PHP_FUNCTION(zeroin_write_int); /* packet, offset, printf , value*/
PHP_FUNCTION(zeroin_write_double); /* packet, offset, printf , value*/
PHP_FUNCTION(zeroin_write_byte); /* packet, offset, value */
PHP_FUNCTION(zeroin_write_bool); /* packet, offset, value */

PHP_FUNCTION(zeroin_set_size);
PHP_FUNCTION(zeroin_set_trcode);
PHP_FUNCTION(zeroin_set_size_trcode);

PHP_FUNCTION(zeroin_get_size);
PHP_FUNCTION(zeroin_get_trcode);

/* 이 녀석들은 packet->status[0] == 9 */
PHP_FUNCTION(zeroin_get_trcont);
PHP_FUNCTION(zeroin_get_rtcode);
PHP_FUNCTION(zeroin_get_msgcode);
PHP_FUNCTION(zeroin_get_msg1);
PHP_FUNCTION(zeroin_get_msg2);
PHP_FUNCTION(zeroin_get_alldata);

일딴 구현에 중점을 두어서, 최적화는 덜되었지만..
이것이 게이트웨이 테스트 소스와 그 실행결과 입니다.
http://www.ezdoum.com/upload/zeroin_gw/zeroin_gw.php.html
http://www.ezdoum.com/upload/zeroin_gw/zeroin_gw.php.txt

요청이 들어 오면 버퍼, 쓰레드풀, tr정보등을 가진 ZSVR이란 넘이 받아서

000100>[zsvr] : [Msg] ProcLIST Dump **************************************************
000100>[zsvr] : [Msg] |ID:-NAME-:-START:--END-:-TIME-:--MODE-:-CNT-:--PID-:----PATH-|
000100>[zsvr] : [Msg] |00:NETSPY:000010:235950:000010:FOREVER: 1: 25551:bin/netspyd|
000100>[zsvr] : [Msg] |01:ZSTCH :085500:160000:000000:FOREVER: 0: 0:bin/zstchesvr|
000100>[zsvr] : [Msg] |02:ZOFCH :085500:160000:000000:FOREVER: 0: 0:bin/zofchesvr|
000100>[zsvr] : [Msg] |03:ZTONG :000030:235930:000030:FOREVER: 1: 25552:bin/ztongbo|
000100>[zsvr] : [Msg] |04:ZRCVD :000030:235930:000030:FOREVER: 1: 25553:bin/zrcvd|
000100>[zsvr] : [Msg] |05:ZSVR :000100:235900:000100:FOREVER: 1: 25598:bin/zsvr|
000100>[zsvr] : [Msg] |06:ZAPODR:000030:235930:000030:FOREVER: 1: 25554:bin/zapodr|
000100>[zsvr] : [Msg] |07:ZAP01 :000031:235930:000031:FOREVER: 1: 25560:bin/zap|
000100>[zsvr] : [Msg] |08:ZAP02 :000032:235930:000032:FOREVER: 1: 25562:bin/zap|
000100>[zsvr] : [Msg] |09:ZAP03 :000033:235930:000033:FOREVER: 1: 25564:bin/zap|
000100>[zsvr] : [Msg] |10:ZAP04 :000034:235930:000034:FOREVER: 1: 25566:bin/zap|
000100>[zsvr] : [Msg] |11:ZAP05 :000035:235930:000035:FOREVER: 1: 25568:bin/zap|
000100>[zsvr] : [Msg] |12:ZAP06 :000036:235930:000036:FOREVER: 1: 25570:bin/zap|
000100>[zsvr] : [Msg] |13:ZAP07 :000037:235930:000037:FOREVER: 1: 25572:bin/zap|
000100>[zsvr] : [Msg] |14:ZAP08 :000038:235930:000038:FOREVER: 1: 25574:bin/zap|
000100>[zsvr] : [Msg] |15:ZAP09 :000039:235930:000039:FOREVER: 1: 25576:bin/zap|
000100>[zsvr] : [Msg] |16:ZAP10 :000040:235930:000040:FOREVER: 1: 25578:bin/zap|
000100>[zsvr] : [Msg] |17:ZAP11 :000041:235930:000041:FOREVER: 1: 25580:bin/zap|
000100>[zsvr] : [Msg] |18:ZAP12 :000042:235930:000042:FOREVER: 1: 25582:bin/zap|
000100>[zsvr] : [Msg] |19:ZAP13 :000043:235930:000043:FOREVER: 1: 25584:bin/zap|
000100>[zsvr] : [Msg] |20:ZAP14 :000044:235930:000044:FOREVER: 1: 25586:bin/zap|
000100>[zsvr] : [Msg] |21:ZAP15 :000045:235930:000045:FOREVER: 1: 25588:bin/zap|
000100>[zsvr] : [Msg] |22:ZAP16 :000046:235930:000046:FOREVER: 1: 25590:bin/zap|
000100>[zsvr] : [Msg] |23:ZAPTST:000030:235930:000030:FOREVER: 1: 25555:bin/zaptst|
000100>[zsvr] : [Msg] |24:ZSISE :000030:235930:000030:FOREVER: 1: 25557:bin/zsise|
000100>[zsvr] : [Msg] ProcLIST Dump **************************************************

뒤에 준비된 zap* 이 녀석들한테 전달을 해주고
ap들이 응답을 주면 요청을 달라고 한 넘들한테 응답을 주는 것이죠.
그러면 php에서는 패킷을 해당 필드 별로 짤라서, php로 표현을 해줍니다.


그리고 실제로 사용이 될때에는
http://www.ezdoum.com/upload/zeroin_gw/view_main.php.html
http://www.ezdoum.com/upload/zeroin_gw/trbase.php.html
http://www.ezdoum.com/upload/zeroin_gw/trC3631.php.html

이런식으로 클래스를 만들어서 사용을 했지요..
php의 클래스 많이 부실하지만 저처럼 비슷 데이터들을
가지고 다녀야 하는 소스들이 많을때는 아주 유용하더군요..

개개별의 tr에서 입력,아웃,배열부분이 원래는 씨 헤더파일로
작성이 되었는데, 좀더 시간이 된다면, 이 스트럭처를 정의하기위한
간단한 스크립트 형태로 만들어서 자동으로 c헤더와, php껍데기를
만들어주는 번역기를 개발할까 생각중입니다.

또, 요청을 받은 다음 원하는 값을 짤라낼 때,
좀 더 db처럼도 구현이 가능은 하지만, 워낙에 프로젝트 기간이 짧고
혼자하다 보니, 최적화가 가장 덜된 부분입니다.

다음번 버전업을 하면 db처럼 필드를 조회하고
속도를 위해 인덱스로 접근을 한다던지,
패킷가공을 좀더 유연하게 하는 방법을 추가할 것입니다.

최종 결과물은 아래의 화면인데,,
http://www.ezdoum.com/upload/zeroin_gw/TrDump.gif
php에서는 db접속이 전혀 없이 gw와 통신을 담당하는 소켓만 하나
열려서 작업을 처리를 하니,, 성능이 상당히 만족 스러웠습니다.
반응 속도도 빠르고요


# 테이블 셀렉트 4번
# 두번의 커서 사용됨
Document Path: /view_main.php?method=GET&tr=O3304&geja=00001024328
Document Length: 5265 bytes

Concurrency Level: 32
Time taken for tests: 6.805 seconds
Complete requests: 1000
Failed requests: 0
Broken pipe errors: 0
Total transferred: 5446000 bytes
HTML transferred: 5265000 bytes
Requests per second: 146.95 [#/sec] (mean)
Time per request: 217.76 [ms] (mean)
Time per request: 6.80 [ms] (mean, across all concurrent requests)
Transfer rate: 800.29 [Kbytes/sec] received


# 테이블 셀렉트 3번
Document Path: /view_main.php?method=GET&tr=O3302&geja=00001024328
Document Length: 5625 bytes

Concurrency Level: 32
Time taken for tests: 4.751 seconds
Complete requests: 1000
Failed requests: 0
Broken pipe errors: 0
Total transferred: 5806000 bytes
HTML transferred: 5625000 bytes
Requests per second: 210.48 [#/sec] (mean)
Time per request: 152.03 [ms] (mean)
Time per request: 4.75 [ms] (mean, across all concurrent requests)
Transfer rate: 1222.06 [Kbytes/sec] received

이 정도 성능이 나오더군요..
(벤치마크라면, 테스트한 환경이나 이런게 명시되어야 할텐데
이 서버가 한가지 작업만 하는게 아니라 여러가지 일을 해서,
최고의 상태라고 보기는 어렵습니다.
미들웨어가 있는 녀석은 2장짜리 펜3 1.2기가 이고
웹서버는 4장짜리 펜3 500 제온입니다.
웹서버가 더 사양이 좋은 것은, 이 녀석도 원래 하는 일이 있는데
인터넷이 이 녀석만 노출이 되어 있어서 ^^)

결론은 사용자가 많이 몰리는 사이트라면 이런식으로 미들웨어를 구현해서
연동하는 것도 좋은 성능을 낼수있는 방법이라고 생각합니다..

ps. 프로젝트가 끝나고 나니까 또 다른 아이디어가 떠올랐는데,
php에서도 db 컨넥션 풀링을 하는,
그런것이 있으면 또 유용할것 같다는 생각이드네요.

찾아본 비슷한 개념의 프로젝트..
http://sourceforge.net/projects/odbcsock

  • 첨부 파일: TrDump.gif TrDump.gif (32 KiB(32,470 Bytes))

    [Image Size 629 x 516]
    TrDump.gif



    [분류: 리눅스 인쇄용 페이지 본문 email로 보내기 ]

  • <  ODBC Socket Server | 그래프 당신이 참피온 입니다!!  >
    PHP 새로운 요청 처리 방법 | 답장: 1개 | 본문에 답장
    정렬 :  
    답장 EzDoum 2003년 02월 11일 오후 06:07 [ 이글에 답장 | 본문에 답장 | 책갈피 ]
    제가 모듈 개발할 때는 zend 메뉴얼에 있는 모듈관련 글을 보면서 개발을 했는데 한글로 강좌를 작성하신 분이 있어서 올려둡니다.

    -> 원문
    http://www.exman.pe.kr/board/phpstudy.php?board_rno=75&mode=view
    http://www.exman.pe.kr/board/phpstudy.php?board_rno=79&mode=view

    -> pdf
    http://www.ezdoum.com/upload/php/modphp1.pdf
    http://www.ezdoum.com/upload/php/modphp2.pdf

    -> 영문 메뉴얼 정리한것
    http://www.ezdoum.com/upload/php/Extending_PHP4.pdf

    -> Extending PHP 4.0: Hacking the Core of PHP
    http://www.ezdoum.com/upload/php/Extending_PHP4_hack.pdf


    [수정]

    PHP 새로운 요청 처리 방법 | 답장: 1개 | 본문에 답장
    정렬 :  

    답장 쓰기
    글을 올리시려면 로그인 (사용자 등록) 하셔야 합니다.

    검색
    Google

    분류
    ·공지 (6)
    ·인터넷 (87)
    ·하드웨어 (260)
    ·C/C++ (65)
    ·어셈블리 (7)
    ·리눅스 (136)
    ·리눅스 커널 (67)
    ·윈도우즈 (25)
    ·데이터베이스 (20)
    ·보안 (16)
    ·.NET (25)
    ·그래픽 (13)
    ·책소개 (42)
    ·호기심 천국 (80)
    ·잡담 (111)
    ·사랑 (3)

    전체 본문수: 963
    전체 답장수: 525


    분류 : 리눅스
    최근글
    최근글
    가장 많이 읽은 글
    ·멀티쓰레드(Pthread) 프로그래밍 (0)
    뜨거운 감자
    ·GNU REGEX (정규표현식) 프로그래밍 강좌 (7)

    EzDoum투표
    이지도움 어때요?
    이게 뭐야. 다시 안올란다. --;
    아이 좋아라~ +_+;
    관심없다.
    먼가는 있는거 같은데 뭐하는 곳이지?
    기타 (자유게시판에 글로 남겨 주세요)
    [ 결과 | 투표 ]

    랜덤 링크
    http://kldp.net


     Home ^ BACK TO TOP ^ EzDoum - 도움이 필요하세요~??
     Powered by KorWeblog 1.5.8 Copyleft © 2001 EzDoum, 관리자: EzDoum