번개애비의 라이프스톼일

똥서버에 웹소켓 100개 연결하기 (php openswoole benchmark) 본문

IT

똥서버에 웹소켓 100개 연결하기 (php openswoole benchmark)

번개애비 2024. 12. 17. 22:02

 

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에 비해서는 약간 못미치는 성능을 보여주는것 같다.

Comments