자유게시판

제목 php 웹소켓 관련 사용 후기 입니다.
글쓴이 방문넷 작성시각 2017/02/12 05:37:27
댓글 : 9 추천 : 0 스크랩 : 0 조회수 : 25168   RSS

게시판 주제애 어긋날수있습니다 ㅎㅎ 팁도 아니고 사용 후기라.. CI사이트 소개도 아니고...

 

몇달전에 PHP7이 올라가면서 소켓에 퍼포먼스에 매우 궁금증이 솟구쳐서 

기존 서비스 하던데에 잠수함 패치 식으로 nodejs의 socket.io와 php 소켓을 같이 사용하게 되었습니다.

 

https://github.com/walkor/phpsocket.io

 

이 라이브러리를 사용하였구요 클라이언트를 socket.io로 사용하기때문에 큰 부담없이 잠수함 패치 식으로 진행하였습니다.

 

웹소켓 사용 용도

1. 사용자 실시간 접속현황(사용자가 어느 페이지에있는지 체크)

2. 에코서버(사용자가 게시판에 게시물 등록하거나, 댓글등록시 알림 메세지)

3. 고객센터 실시간 상담 채팅

 

3가지를 중점을 두고 한번 데몬을 돌려보았습니다.

 

서로 벤치마킹할 조건은 크지않았습니다.

 

1. 반응속도

2. 서버의 지속성(알수없는 오류 혹은 코드 미흡으로 인해 다운증상)

3. Nginx의 역방향 프록시 및 로드벨런싱 반응속도

4. 데이터베이스 셀렉트 및 업데이트

5. 동시접속 20~100커넥션. 피크타임때는 150커넥션 1시간 가량 유지.

 

5가지를 중점을 두고 살펴 보았습니다.

 

1. 반응 속도

반응속도는 socket.io가 압도적입니다. 30~40커넥션정도에 브로드캐스팅을 3초내지 5초 간격으로 약 30번 데이터(JSON 문자길이 100글자 미만)를 전송시에 100~200ms 정도로 문제없이 잘 전송하여습니다. php 웹소켓의 경우는 약간 더디는게 없지않아 있었습니다 200ms에서 늦으면 500ms정도 걸렸습니다.

전송할때에는 데이터베이스 셀렉트 3회 데이터 포멧 만들고 전송을 했을때 입니다. 반응 속도에 대해서는 딱히 동시접속 수천명 이상이 아닐경우에는 

소규모에서는 나쁘지않았습니다.

 

2. 서버의 지속성

음 이건 호불호가 가려지는데요

nodejs의경우는 이상하게 메모리 릭이 심각하게 발생 하였습니다.

최대한 줄여보고자 console.log도 찍지도 않고 엄한 로직은 최대한 삼가하면서 작성을 하였으나

주기적으로 메모리가 게속 쌓이다가 아무 에러없이 죽는경우가 간간히 발생 하였습니다

php의 경우는 딱히 메모리 릭이 발생하지도 않았고 오히려 제 입장에선 php소켓이 안정적이었습니다.

try to catch final을 자주사용했음에도 불구하고 node.js가 한 한달에 한두번 서비스 중단될때 php의경우는 

한건도 없었습니다.

근데 이건 로직의 차이일수도있고 더군다나 서버의 지속성을 테스트할 정도의 로직들은 아니었습니다..

이건 제 역량에 문제로...넘기기로 ㅎㅎ;;;

 

3. Nginx 역방향 프록시 및 로드벨런싱 반응속도

음 이것도 1번이랑 비슷한경우인데 로드벨런싱때는 조금 차이가 있었습니다.

잠수함 패치를 할때에 nginx를 로드벨런싱으로 이용하였습니다. nodejs 소켓서버와 php소켓서버를 번갈아 가며 사용할수있게 말이죠..

커넥션시에는 서로 비슷한 속도이긴 하나... 데이터를 반환할시는 nodejs가 확실히 빨랐습니다.

 

4. 데이터베이스 셀렉트 및 업데이트

nodejs에서는 node-activerecord 모듈을 사용 하였고 php소켓서버의 경우는 MysqliClass 라는걸 사용 하였습니다. 

데이터베이스 입출력시 서로 별반 다를께없었지만 코드 진행함에있어서 php가 좀더 편했습니다.. nodejs의경우는 콜백...땜시 async 혹은 promise 를 사용해야

원활하게 사용가능하지만 코드를 보기엔 아무래도 php가 좀더 편안했습니다... 굳이 속도를 따지고 들어가면 nodejs가 좀더 빨랐습니다. 접속방법의 차이이긴하지만요..

 

5. 동시접속 유지 관련

nodejs랑 php랑 동시접속 차이를 좀 두고 보자면 nodejs가 솔직히 압승입니다. php에서는 메모리 점유율이 조금 지나치게 높다? 정도였구요.

평균 100커넥션이 있고 페이지 이동때문에 수초내로 소켓 커넥션 디스커넥션이 자주 일어납니다. 이점을 두고 볼때 

nodejs는 비교적 안정적인 커넥션이 이루어졌고 php의경우는 살짝 멍타다가 타임아웃이 나는경우가 조금 있었습니다.

하지만 접속이 되었을때는 서로 동등한 접속자수를 유지 하고 또한 에코서버로서의 기능도 제대로 해주었습니다..

 

아참! nodejs서버 버전을 이야기를 안했군요 . 6.9 버전대 입니다(수시로 업데이트해서 6.9 LTS 버전대이네요 ^^;;)

 

약 2개월 가량 운용하면서 느낀점이 php 소켓서버도 딱히 나쁘지않다 라는 판단을 했습니다.

대규모 서비스시에는 모르겠지만  PHP코드가 편한 저로썬 nodejs보다는 조금이나마 덜 힘들다라는 판단이 들더라구요..

저는 소규모로 했을뿐이고 필요한 부분안 소켓연결하였기에 나쁘지않다 라는 판단이 들었습니다.

현재 이글을 적으면서도 PHP 소켓을 모니터링 하고있습니다. 로깅기록과 함께말이죠 ㅎㅎㅎ

조만간에 완전히 nodejs를 걷어내고 php소켓으로만 한번 운용을 할 계획입니다..

nodejs로 하다보니 코드가 점점 산으로가는기분이여서... 

소켓서버도 일체감있이 php로 ...한번....................

 

이상 말도 안되는 사용후기 였습니다!

 다음글 2017년 2월 정모 잘하고 들가는중.. (8)
 이전글 기술적 꼰대. 그리고 진부한 이야기. (2)

댓글

kaido / 2017/02/12 11:03:02 / 추천 1

흠. 예상대로의 결과이긴 하네요. ㅎㅎ

php.. 아니 동기적인 서버 반응의 고질적인 문제 때문에 나온것이 node.js 이죠.

바로 동시 접속이 많아질수록 메모리 사용율이 단순 곱셉이 아니라 제곱단위로 올라간다는 것입니다.

가령... 1명당 1M씩 먹는다 치고 10명이면 10~12M 정도이라면 100명이면 100M이 아니라 500M을 훨씬넘어가게 됩니다.

[물론 수치는 그냥 상징적인것입니다.]

약 14년전에도 일반적인 서버는 php 소켓으로 1000명이 한계점이라고 말이 나왔는데, 테스트 하신거 보니 큰 차이는 없어보이네요.

 

이 고질적인 메모리 문제는 php만 있는것이 아닙니다.

그래서 더욱 원시적인 언어로 점차 내려서 만들기도 하였죠.

PHP에서 C++ 스타일로. C++ 에서 C로.

 

지금은 그럴 필요없이 node이라는 혁명적인 물건을 사용할뿐이죠.

 

이전에 개인 서버에 node 채팅을 넣고서 한 2년간 운영한적 있었습니다. 물론 소규모라서 별다른 문제가 없다보니, 서버를 내기전까지는 죽지도 않고 잘 돌아가더군요.

[그때가 4년전이었으니... 버전은 낮은 버전이었을겝니다. node 관련 책이 국내 1권도 안나왔던 시절이라..]

 

양승현 / 2017/02/13 09:51:11 / 추천 0

예전 커뮤니티 운영시절 필요했던 정보이네요. ㅎㅎ

동접자수가 너무 많아 서버가 시도때도 없이 뻗어서 힘들어하던 시절..

방문넷 / 2017/02/13 10:43:09 / 추천 0

@kaido // Nginx셋팅에 대한 잘못인지 프록시 안통하고 바로 다이렉트로 소켓서버 붙으면 속도 와방 빠릅니다. Nodejs나 php나 별차이없네요 속도 차이는... 허나.... 메모리는 진짜 nodejs가 갑인거같습니다 ㅎㅎ

 

@양승현 // 철지난 자료라도 저처럼 잉여시간을 활용하고자하시는분들께 수고좀 덜어드리기 위해 한번 말도안되는 정보를 공유해보았습니다 ㅎㅎ;;

kaido / 2017/02/13 11:08:57 / 추천 0

@방문넷

원래 속도는 어차피 큰 차이 없어요 ㅋㅋ 

nodejs 도 php 소켓도 java 소켓도 안드로이드 소켓도 ios 소켓도

전부 C 언어를 베이스로 만들어진 프로토콜로 보냅니다.

안에 로직 까보시면 생긴거 똑같아요.

[아 ios만 조금 다릅니다. 보내고 받는 순서가 역순임]

 

소켓 속도는 처음부터 큰 차이 없는게 맞습니다.

다만 그놈의 메모리 문제가 심해서 그렇죠.

사실 java에서는 더 무겁게 돌아가지만, 이를 막아줄 여러가지 기술들이 있거든요.

NIO 단계에서 컨트롤 하거나, 스컬 & 리모트를 걸고 하거나.

 

물론 최대한 메모리 사용량을 줄이거나, 전가를 한다 해도 메모리 사용율은 nodejs 가 갑이죠.

 

그리고 철지난 자료이라고 하지만, 소켓 프로그램을 다시 적극 활용할 시대가 다가오고 있습니다.

아니 이미 개발에 뛰어들은 상태이구요.

최근 금융권에선  AI 자동 채팅 봇 서비스 도입이 한참이라고 하더군요.

한대승(불의회상) / 2017/02/13 11:10:47 / 추천 0

@kaido AI가 지배할 지도 모를 ... 세상~~

PHP도 프로세스 하나 띄우고 이벤트 드리븐으로 작성하면 좀 더 메모리 효율을 보입니다.

양승현 / 2017/02/13 19:07:04 / 추천 0
@방문넷 철지난 자료라는게 아니라 그시절 이런 정보가 있었으면 좋았을거다 라는 말이에요.

소중한 경험과 팁들 올려주시는데 누가 옛날 자료라고 까대나요.. 그런사람 있음 저에게 대려오셔요. 바로벤~
방문넷 / 2017/02/14 10:56:40 / 추천 0

@kaido // 사실 php 신나게 코드 작성하고나서 살짝 느낀건데.. 메모리 점유율이 가히 폭발적이라.. 같은 시간 같은 열정을 쏟아 붓기에는 .... 아직까진 nodejs네요.. 다시 선회하고있습니다 ㅎㅎ

@한대승 // 제가 사용했던 라이브러리가 그것과 같은 형태 였던가 아마 그랬을꺼예요.. 하지만 제가 작성한 코드는 어딘가 모르게 쭉쭉 메모리가 늘어나는 경향이있어서 삽질을 계속 했다지요 ㅎㅎㅎ

@양승현 // 아아 제 단어 선택에 오해의 소지가 있을뻔했네요 ㅎㅎ 그럼 조심히 까는? 분 계시면 살짝 귓속말드릴께요 ㅎㅎ

/ 2017/02/16 11:26:15 / 추천 0

@방문넷 - 노드 뻗으면 다시 살려주는 forever?맞나 것보다 좋아요. pm2 쓰세요~~ 좋아요~~!

전 php http://socketo.me << 이거로 채팅 만들었는데 괜찮네요...

방문넷 / 2017/02/16 12:09:40 / 추천 0

@닉 // 오호 이런것이 있었군요 한번 유심히 살펴 봐야겠습니다 정보 감사합니다! 노드는 forever 보단 자체적으로 만든 스켸쥴러로 관리합니다.