성능과 효율성은 종종 네트워크 프로그래밍에 PHP를 사용할 때 개발자의 초점, 특히 TCP 프로토콜을 기반으로하는 소켓 통신입니다. socket_set_option은 PHP가 소켓의 동작을 설정하기 위해 제공하는 함수입니다. 일반적인 옵션 중 하나는 tcp_nodelay 입니다. 이 기사는 TCP_NODELAY를 설정하는 역할을 심층적으로 탐색하고 TCP 통신 효율성을 향상시키는 실용적인 방법을 공유합니다.
tcp_nodelay 의 의미를 이해하기 전에 Nagle 알고리즘을 살펴 보겠습니다.
Nagle 알고리즘은 작은 패킷의 수를 줄이기 위해 설계된 TCP 최적화 기술입니다. 애플리케이션이 자주 작은 데이터 패킷을 보내면이 패킷은 매번 한 번씩 네트워크 전송을 트리거하여 심각한 네트워크 혼잡을 일으 킵니다. Nagle 알고리즘은 이전 패킷의 승인 (ACK)이 도착하거나 버퍼가 채워질 때 까지이 작은 패킷을 캐시합니다.
이 알고리즘은 대역폭을 절약 할 수 있지만, 특히 게임, 실시간 푸시 서비스, 재무 데이터 전송과 같은 저명한 실시간 통신 시나리오에서 "대기 시간"을 가져옵니다.이 지연은 병목 현상이됩니다.
TCP_NODELAY 는 Nagle 알고리즘을 끄는 소켓 옵션입니다. 전송 작업이 버퍼가 ACK를 채우거나받을 때까지 기다리지 않고 즉시 패킷을 보냅니다.
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$socket) {
die("만들다 socket 실패하다: " . socket_strerror(socket_last_error()));
}
// 폐쇄 Nagle 연산
socket_set_option($socket, SOL_TCP, TCP_NODELAY, 1);
socket_connect($socket, 'gitbox.net', 8080);
socket_write($socket, "GET /data HTTP/1.1\r\nHost: gitbox.net\r\n\r\n");
$response = socket_read($socket, 1024);
echo $response;
socket_close($socket);
위의 코드에서는 tcp_nodelay를 Socket_set_option 으로 1 로 설정하면 작은 패킷을 보낼 때 PHP 지연을 크게 줄이고 응답 속도를 향상시킬 수 있습니다.
Nagle 알고리즘을 끄면 대기 시간에 민감한 응용 프로그램의 응답 속도가 향상 될 수 있지만 모든 시나리오에 항상 적합한 것은 아닙니다. 다음은 tcp_nodelay를 사용하는 데 적합한 몇 가지 시나리오입니다.
실시간 시스템 : 온라인 게임, 실시간 협업 편집자, 채팅 애플리케이션 등과 같은
고주파 패킷 통신 : 응용 프로그램이 자주 수십 바이트의 데이터를 보내면 TCP_NODELAY를 활성화하는 것이 더 적절합니다.
낮은 대기 시간 요구 사항 : 금융 거래, 사물 인터넷에서 실시간 센서 데이터 업로드 등
대기 시간에 민감하지 않고 대역폭에 민감한 파일 전송 및 웹 페이지로드와 같은 시나리오의 경우 네트워크 오버 헤드를 줄이기 위해 Nagle 알고리즘을 유지할 수 있습니다.
Nagle 알고리즘을 끄는 것 외에도 TCP 통신의 효율성을 더욱 향상시킬 수있는 몇 가지 방법이 있습니다.
전송 및 수신 버퍼 크기는 socket_set_option 을 통해 설정할 수 있습니다.
socket_set_option($socket, SOL_SOCKET, SO_SNDBUF, 4096);
socket_set_option($socket, SOL_SOCKET, SO_RCVBUF, 4096);
데이터 볼륨에 따라 버퍼 크기를 동적으로 조정하면 자주 시스템 호출과 차단을 피할 수 있습니다.
높은 동시성 시나리오에서 하나의 연결이 전체 프로세스를 차단하지 않도록 소켓을 비 블로킹 모드로 설정합니다.
socket_set_nonblock($socket);
socket_select ()를 사용하거나 이벤트 중심 프레임 워크를 사용하는 것이 좋습니다.
오랫동안 데이터 교환없이 중간 라우터가 연결을 닫지 않도록하십시오.
socket_set_option($socket, SOL_SOCKET, SO_KEEPALIVE, 1);
TCP_WINDOW_SCALING , TCP_RMEM , TCP_WMEM 등과 같은 운영 체제 수준을 통해 TCP 프로토콜 매개 변수를 조정하면 특히 높은 스루 푸트 애플리케이션에서 성능이 크게 향상 될 수 있습니다.
Socket_set_option 의 TCP_NODELAY 는 매우 중요하지만 종종 간과되는 최적화 방법입니다. Nagle 알고리즘을 합리적으로 끄면 낮은 격렬한 응용 프로그램에서 응답 속도를 크게 향상시킬 수 있습니다. 물론, 특정 비즈니스 요구에 따라 활성화할지 여부를 선택해야합니다. 버퍼 최적화를 결합함으로써 만 블로킹 프로그래밍 및 커널 레벨 튜닝은 효율적이고 강력한 TCP 통신 애플리케이션을 구축 할 수 있습니다.
실제 개발에서는 간단한 설정으로 시작하여 네트워크 서비스 성능을 단계별로 향상시킬 수 있습니다.