번개애비의 라이프스톼일
똥서버에 웹소켓 100개 연결하기 (php openswoole benchmark) 본문
ReactPHP와 같이 최근 php 진영에서도 node나 golang과 같이
논블록킹 I/O를 지원할 수 있도록 하는 서드파티 익스텐션이 나오고 있다.
그 중에서도 C++로 작성되어 php로 작성된 ReactPHP보다 성능이 좋다고 하는 swoole extension을 테스트 해봤다.
굉장히 단편적고 단순한 테스트임으로 참고만 하길...
일단 테스트서버는 구름 IDE에서 제공하는 가장 낮은 사양의 서버를 준비했다.
0.5vCPU / 1GB Memory를 갖는 빈 컨테이너를 준비했고,
우분투 24.04, PHP 8.3.14에 openSwoole은 22.1.2버전을 사용했다.
(참고로 Swoole과 Openswoole 은 엄연히 다르고 사용하는 방식도 다름!)
cli로 구동되는 php openswoole의 경우, node.js나 golang처럼
프로그램 동작중에 급작스러운 Fetal 에러가 발생되면 프로세스가 종료되면서 서비스전체가 다운될 수 있음으로
pm2를 사용하는 node.js 처럼 Supervisor를 설치하여 php를 감시할 수 있도록 하였다.
다음은 웹소켓 서버를 열어주는 간단한 예제이다.
<?php
use OpenSwoole\WebSocket\Server;
use OpenSwoole\Http\Request;
use OpenSwoole\WebSocket\Frame;
$server = new Server("0.0.0.0", 9502);
$server->on("Start", function(Server $server){
echo "OpenSwoole WebSocket Server is started at http://127.0.0.1:9502\n";
});
$server->on('Open', function(Server $server, OpenSwoole\Http\Request $request){
echo "connection open: {$request->fd}\n";
$server->tick(1000, function() use ($server, $request){
$server->push($request->fd, json_encode(["hello", time()]));
});
});
$server->on('Message', function(Server $server, Frame $frame){
echo "received message: {$frame->data}\n";
$server->push($frame->fd, json_encode(["hello", time()]));
});
$server->on('Close', function(Server $server, int $fd){
echo "connection close: {$fd}\n";
});
$server->on('Disconnect', function(Server $server, int $fd){
echo "connection disconnect: {$fd}\n";
});
$server->start();
?>
/etc/supervisor/conf.d/blabla.conf 에 설정한 supervisor설정은 다음과 같다.
[program:swoole_websocket]
command=php /경로/swoole_websocket.php queue:work
directory=/경로
autostart=true
autorestart=true
user=www-data
stdout_logfile=/var/log/swoole_websocket.log
sudo supervisorctl shutdown 명령후
sudo supervisord -c /etc/supervisor/supervisord.conf 으로 강제 실행하여 openswoole 웹소켓 서버를 실행했고,
원래는 Nginx에서 ReverseProxy를 통해 SSL을 붙여주려하였으나,
귀찮아서 구름에서 제공하는 URL을 그대로 사용했다.
(잘 작동되는것을 보아하니 이 친구도 Reverseproxy임에 틀림이 없다 ㅋㅋ)
웹소켓 클라이언트는 귀찮으니 Piehost에서 제공해주는 웹소켓 테스터를 활용했다.
그냥 무식하게 100개 탭을 열어 웹소켓 연결을 진행했다.
https://piehost.com/websocket-tester
시스템 프로세스별 점유량은 위와 같고...
구름 IDE에서 제공하는 컨테이너 사용량 상태를 봤을때는 아주 아주 준수했다.
생각보다 효율적으로 작동되어 단순한 기능을 작동시키는 마이크로서비스를 구성하기에
아주 좋은 방법일 듯 하다.
해외 커뮤에서 직접적으로 벤치를 진행해서 비교한 결과를 보면
node보다는 성능이 우수하고 golang에 비해서는 약간 못미치는 성능을 보여주는것 같다.
'IT' 카테고리의 다른 글
macOS에서 윈도우 키보드의 커맨드키를 설정하는 방법 (0) | 2024.12.16 |
---|---|
애플 M1 Max 맥북과 제온 40코어 128GB 서버 간 php 벤치마크 비교 (1) | 2024.11.03 |
구름 IDE에서 저장 시 자동으로 Github에 커밋하는 방법 (공유된 사용자마다 개별계정 연결 방법 포함) (1) | 2024.10.29 |
WD-N522S (우리넷 LTE Cat.M1 외장형모듈) 사용후기 및 데이터시트 공유 (4) | 2024.06.21 |
리눅스 Google Chrome 설치시 glibc 버전문제로 설치가 불가능할때 (4) | 2024.06.19 |