[발 번역] Scale PHP on Ec2 to 30,000 Concurrent Users / Server

해당 문서는 https://coderwall.com/p/__z9ia 를 발 번역한 것입니다. 오역에 주의하시기 바랍니다. 장인의 숨결이 느껴지네요.

RockThePost.com은 아마존 EC2 에서 LAMP 스택을 사용합니다. 동시에 하나의 메일을 백만명의 투자자들에게 보내는 기능을 준비하고 있습니다. 딱, 두명 뿐인 엔지니어링 팀이라, 동시에 몇명의 사람에게 메일을 보낼 수 있는지 빨리 확인해야 했습니다.

서비스는 PHP Zend 프레임워크 2를 사용했고, 웹 서버는 두 대의 m1.medium EC2 장비를 로드 분산을 위해서 ELB에 붙여서 사용했습니다. 그리고 백엔드는 MySQL 을 Master/Slave 방식으로 사용했습니다. 일반적으로 조그만 회사에서 사용하는 것과 거의 유사합니다.

순서 무시하고 그냥 제 생각을 적습니다.

  • PHP의 APC를 사용하자. 왜 이게 디폴트 설정이 아닌지 모르겠제만, APC 설정을 켜두면 성능이 잘 나옵니다.(역자 주: 밑에 코멘트를 보면 APC 사용을 중지하고, Zend의 새로운 OpCache로 옮겼더니, 전체적으로 초당 리퀘스트 처리가 10%~30% 올라갔다고 합니다. PHP 5.5에 들어가 있지만, 5.3, 5.4에서도 사용이 잘 된다고 하네용. PHP-FPM 형태로 사용하면 될듯합니다.)
  • php 요청이 아니면 전부 CDN에 넣어두자. 스태틱 파일 요청 때문에, 서버에 부하를 줄 필요가 없다. 우리는 모든 것을 S3에 올려두고, CloudFront를 사용했다.[부연 설명] : CloudFront 는 최근에 몇몇 이슈가 있었다. CloudFront 이슈가 해결되기 전까지는 모든 스태틱 파일이 S3에서 바로 처리되도록 설정을 변경했다. (역자 주: 무슨 이슈가 있었는지는 잘 모르겠습니다.)
  • PHP code에서 다른 서버로 연결을 만들지 말자. 예를 들어, DBMS나 memcached에 접속하는 것입니다. 무조건 해야 되는 상황이 아니라면, 쓰지 말자. 대부분의 PHP 웹 서비스가 백엔드 세션 관리를 위해서 MySQL을, 캐싱을 위해 멤캐쉬 풀을 이용할꺼라고 생각한다. 다른 서버로의 접속을 코드의 실행 흐름중에 만드는 것은 효과적이지 않다. CPU가 연산 중에, 컨넥션을 만들기 위해서 대기해야 한다. 그 대신에, APC key/value 스토어를 PHP에서 데이터를 저장하기 위해서 사용하고, 전체 페이지 캐싱에는 Varnish를 사용하자.
  • Varnish 를 쓰라는 것을 다시 한번 강조한다. 내 경험상, 대부분의 페이지는 절대로 변경되지 않거나, 거의 어쩌다가 한번 변경된다. Varnish는 웹 서버 캐싱계의 Memcache/ModRewrite 다. 웹 서버에 Varnish를 추가하면 부하 테스트시에 엄청난 성능차를 보여준다.
  • c1.xlarge 인스턴스를 사용하자. m1.medium은 겨우 한개의 CPU로 모든 리퀘스트를 처리해야 한다. 8개의 CPU를 가진 c1.xlarge로 업그레이드 한 뒤에, 실제로 비용이 줄었다는 것을 알게 되었다. 부하 테스트 동안, apt-get install nmon을 해서 nmon을 설치하고, nmon을 실행시켜서 CPU를 모니터링 했는데, 말 그대로, 8개의 코어가 페이지 요청을 마구마구 처리하고 있는 것을 볼 수 있을 것이다.

Google Analytics는 평균적으로 유저가 얼마 정도의 페이지를 요청하는 지를 보여준다. 이 정보를 이용해서, 위의 내용들을 적용한 뒤, 부하 테스트를 Siege를 이용해서 수행했다. 스태틱 페이지는 한 서버당 동시에 30,000 명의 유저를 처리할 수 있었고, PHP가 생성해야 하는 내부 페이지는 한 서버당 동시에 1000개 이상의 세션을 처리할 수 있을꺼라고 생각한다. 다수의 이메일 발송을 위해서, 차후에, 여러 대의 c1.xlarge 서버들을 추가할 것이고, 실제 서비스 부하에 따라서 개수를 천천히 줄일 것이다.

Finally, we will do more work to make our code itself more scaleable… however, the code is only about 4 months old and this is the first time we’ve ever been challenged to actually make it scale.

마지막으로, 코드를 확장 가능하게 만들게 더 많은 노력을 들이겠지만, 현재 코드가 아직 4개월 밖에 안됬고, 앞으로 계속 확장가능하도록 노력할 것이다.

RockThePost.com 에 대해서

새로운 스타트업 기업을 위해서 기업가가 돈을 모을 수 있도록 돕고 있습니다. 소셜 크라우드 펀딩을 이용하고 싶으면 “HACKERNEWS”라는 쿠폰을 사용하면 50% 할인 받으실 수 있습니다.