Program/Php

PHP - Non-Thread Safe , Thread Safe

soccerda 2020. 7. 16. 19:07
반응형

TS(Thread Safe) , NTS(Non Thread Safe)에 대해서 알아보자.

 

Thread Safe

멀티 프로세서 환경에서 동작해도 원래 의도한 형태로 동작하는 코드로 특정 함수나 변수, 혹은 객체가 여러 Thread로부터 동시에 접근해도 정상적으로 동작해야 한다.

 

thread safe는 아래 조건을 만족해야 한다.

1. Re-entrancy : 특정 함수가 한 thread에서 호출되어 실행 중일 때, 다른 thread가 그 함수를 호출하더라도 결과가 각각에게 올바르게 주어져야 한다.

 

2. Thread-loca storage : 공유자원의 사용을 최대한 줄인다. 각각의 thread에서만 접근 가능한 저장소(스택 영역)의 데이터를 사용함으로 동시 접근을 막는다.

 

3. Mutual exclusion : 공유 자원을 사용할 경우, 해당 자원의 접근을 세마포어 등의 락으로 통제한다.(동기화)

 

4. Atomic operations : 공유자원에 접근하는 연산을 atomic 연산으로 하거나 atomic하게 정의된 접근 방법을 사용하여 구현한다.

 

과거는 TS만 제공하였다.

리눅스/유닉스 계열은 멀티 프로세스 방식이었기 문제가 없었는데

 

근데 윈도 계열에서 멀티 프로세스 방식인 TS 버전을 빌드하면서 문제가 생겼다.

 

PHP를 윈도 웹서버인 IIS와 연동하기 위해서는 CGI 또는 ISAP 방식으로 연동해야 했는데 멀티 Thread로 개발된 PHP와 모듈을 역시 멀티 Thread 방식으로 개발한 ISAPI로 연동했을 때 서버가 다운되는 현상이 발생하게 되었다. 그래서 안정적인 방법으로 CGI를 변경된 TS가 나왔지만 성능이 저하되어 안정성 대신 성을을 개선한 NTS 버전이 나왔다.

 

웹서버와 권장 버전

IIS, ISAPI: Thread Safe version
IIS, CGI or Fast CGI: Non Thread Safe version
Apache MPM worker: Thread Safe version
Apache MPM prefork: Non Thread Safe version
Nginx Fast CGI : Non Thread Safe version

 

 

Apache MPM (다중처리 모듈 , Multi-Processing Module)

 

* prefork 방식
프로세스당 스레드(연결) 1개
자식 프로세스는 최대 1024개까지 가능
스레드간 메모리 공유 안함
→ 독립적이라 안정적
→ 메모리를 많이 사용
안정성과 오래된 소프트웨어와의 호환성이 필요한 사이트
PHP Non Thread Safe version

 

* worker 방식
프로세스 당 스레드(연결) 여러 개
메모리 공유 사용
→ 메모리 사용량 적음
 통신량이 많은 서버에 적절
→ 리소스 경합 주의 필요
높은 확장가능성(scalability)이 필요한 사이트
PHP Thread Safe version

 

 

PHP: FPM(FastCGI Process Manager)

반응형