Facebook이 PHP 외에 C ++을 사용한 이유는 무엇입니까? [닫은]


15

Facebook이 PHP 외에 C ++을 사용해야하는 주된 이유는 무엇입니까? Vistor가 많은 웹 사이트를 만들면 C ++도 사용해야하는지 궁금합니다.


백엔드 프로세스에 적합 할 수 있지만 정기적 인 웹 개발을하는 것은 미치게됩니다.
ChaosPandion

1
programmers.stackexchange.com/questions/53624/… 질문 에서도이 문제에 대해 설명합니다. 당신은 그것을보고 싶을 수도 있습니다.
Vitor Py

4
Google은 왜 서버를 C ++로 작성합니까?
Job

1
@Job 및 Java 및 Python.
rightfold December

5
@ WTP, 내 지식으로는 Python은 새로운 기능을 프로토 타이핑하고 테스트하는 목적으로 사용됩니다. 사용자로드가 높아지고 가능한 빨리 작동해야하는 경우 Python 코드는 C ++ 코드로 대체됩니다. 1.2 억 정도의 작은 속도 차이가 수억 명의 사용자가있는 서버에 큰 영향을 미친다고 확신합니다.
Job

답변:


20

이유는 다음과 같습니다. HipHop for PHP : Move Fast :

Facebook의 주요 가치 중 하나는 빠르게 움직입니다. 지난 6 년간 우리는 PHP가 제공하는 빠른 개발 속도 덕분에 많은 성과를 거둘 수있었습니다. 프로그래밍 언어로서 PHP는 간단합니다. 배우기, 쓰기, 읽기 및 디버깅이 간단합니다. 우리는 새로운 언어를 페이스 북에서 다른 언어보다 PHP로 훨씬 빠르게 발전 시켜서 더 빠르게 혁신 할 수있게되었습니다.

오늘 저는이 프로젝트를 놀라운 사람들로 구성된 소규모 팀과 공유하게되어 기쁩니다. 지난 2 년간 일해 왔습니다. PHP 용 힙합. HipHop을 사용하면 페이지에 따라 웹 서버의 CPU 사용량이 평균 약 50 % 줄었습니다. CPU가 적을수록 서버 수가 줄어들어 오버 헤드가 줄어 듭니다. 이 프로젝트는 Facebook에 막대한 영향을 미쳤습니다. 우리는 웹이 크게 HipHop의 혜택을 누릴 수 있다고 생각합니다. 따라서 우리는 오늘 저녁 PHP를 사용하여 대규모의 복잡한 웹 사이트를 확장하는 데 새로운 초점을 맞추기 위해 오픈 소스로 공개하고 있습니다. HipHop은 우리에게 놀라운 결과를 보여 주었지만, 완벽하지는 않으며 베타 소프트웨어를 사용하기 전에 편안해야합니다.

PHP 용 HipHop은 기술적으로 컴파일러 자체가 아닙니다. 오히려 소스 코드 변환기입니다. HipHop은 프로그래밍 방식으로 PHP 소스 코드를 고도로 최적화 된 C ++로 변환 한 다음 g ++를 사용하여 컴파일합니다. HipHop은 의미 적으로 동등한 방식으로 소스 코드를 실행하고 성능 향상을 위해 eval ()과 같이 거의 사용되지 않는 일부 기능을 희생합니다. HipHop에는 코드 변환기, PHP 런타임 시스템의 재 구현 및 이러한 성능 최적화를 활용하기위한 많은 일반적인 PHP 확장을 재 작성하는 기능이 포함되어 있습니다.

스크립팅 언어로 PHP 확장

PHP의 근본은 Perl, Python 및 Ruby와 같은 스크립팅 언어의 근본으로, 프로그래머 생산성 및 제품에서 빠르게 반복하는 기능에 큰 이점이 있습니다. 이것은 C ++과 같은 전통적인 컴파일 언어와 Java와 같은 해석 언어와 비교됩니다. 반면, 스크립팅 언어는 일반적으로 CPU 및 메모리 사용과 관련하여 효율성이 떨어지는 것으로 알려져 있습니다. 이로 인해 페이스 북을 매달 4 천억 건 이상의 PHP 기반 페이지 뷰로 확장하는 것이 어려웠습니다.

이러한 비 효율성을 해결하는 한 가지 일반적인 방법은 PHP 응용 프로그램의 복잡한 부분을 C ++에서 직접 PHP 확장으로 다시 작성하는 것입니다. 이것은 PHP를 프론트 엔드 HTML과 C ++의 응용 프로그램 논리 사이에서 풀 언어로 변형시킵니다. 기술적 인 관점에서 이것은 잘 작동하지만 전체 응용 프로그램에서 작업 할 수있는 엔지니어 수를 크게 줄입니다. C ++ 학습은 PHP 확장을 작성하는 첫 번째 단계 일 뿐이며, 두 번째는 Zend API를 이해하는 것입니다. 엔지니어링 팀의 규모가 작기 때문에 (엔지니어마다 백만 명 이상의 사용자가 있음) 코드베이스의 일부를 다른 사람보다 쉽게 ​​액세스 할 수 없습니다.

거의 모든 페이지보기가 사용자 지정된 경험을 가진 로그인 한 사용자이기 때문에 Facebook을 확장하는 것은 특히 어려운 일입니다. 홈페이지를 볼 때 모든 친구를 찾아보고 (우리가 멀티 피드라고하는 사용자 지정 서비스에서) 가장 관련성 높은 업데이트를 쿼리하고 개인 정보 설정에 따라 결과를 필터링 한 다음 주석으로 스토리를 작성해야합니다. , 사진, 좋아요 및 사람들이 Facebook에 대해 좋아하는 모든 풍부한 데이터. 이 모든 것이 1 초 안에 완료됩니다. HipHop을 사용하면 C ++, Erlang, Java 또는 Python의 사용자 정의 백엔드 서비스를 사용하여 뉴스 피드, 검색, 채팅 및 기타 핵심 부분을 서비스하면서 PHP에서 최종 페이지 어셈블리를 수행하는 로직을 작성하고 빠르게 반복 할 수 있습니다. 사이트의.

2007 년부터 우리는 이러한 문제를 해결하기위한 몇 가지 다른 방법에 대해 생각하고 그 중 몇 가지를 구현하려고 시도했습니다. 일반적인 제안은 Facebook을 다른 언어로 다시 작성하는 것이지만 사이트의 복잡성과 개발 속도가 빠르면 시간이 좀 걸릴 것입니다. 우리는 PHP의 내부 인 Zend Engine의 측면을 다시 작성하고 이러한 패치를 PHP 프로젝트에 다시 기여했지만 궁극적으로 필요한 성능 향상을 보지 못했습니다. HipHop의 이점은 개발 속도에 거의 투명합니다.

힙합 해킹

몇 년 전 Hackathon에서 어느 날 밤 (프라임 타임 핵 참조) PHP를 C ++로 변환하는 첫 번째 코드를 시작했습니다. 언어는 구문 적으로 상당히 유사하며 CPU와 CPU 사용 모두에서 C ++이 PHP보다 훨씬 뛰어납니다. PHP 자체도 C로 작성되었습니다. 우리는이 크기의 전체 코드베이스를 손으로 직접 다시 작성하는 것이 불가능하다는 것을 알고 있었지만 프로그래밍 방식으로 시스템을 구축하면 어떻게 될지 궁금했습니다.

PHP 성능을 향상시키는 새로운 방법을 찾는 것은 새로운 개념이 아닙니다. 런타임에 Zend Engine은 PHP 소스를 opcode로 변환 한 다음 Zend Virtual Machine을 통해 실행됩니다. APC 및 eAccelerator와 같은 오픈 소스 프로젝트는이 출력을 캐시하며 대부분의 PHP 기반 웹 사이트에서 사용됩니다. opcode 최적화 및 캐싱을 통해 PHP를 더 빠르게 만드는 상용 제품인 Zend Server도 있습니다. 대신, PHP 소스를 직접 C ++로 변환 한 다음 네이티브 머신 코드로 변환 할 수있었습니다. PHP 컴파일은 새로운 아이디어가 아니며 Roadsend 및 phc와 같은 오픈 소스 프로젝트는 PHP를 C로 컴파일하고 Quercus는 PHP를 Java로 컴파일하며 Phalanger는 PHP를 .Net으로 컴파일합니다.

말할 것도없이 단일 해커 톤보다 오래 걸렸습니다. 8 개월 후, 컴파일 된 코드로 더 빠르게 실행할 수 있음을 보여줄 수있는 코드가 충분했습니다. 우리는 프로젝트의 속도를 높이기 위해 Iain Proctor와 Minghui Yang을 팀에 신속하게 추가했습니다. 우리는 다음 10 개월 동안 모든 코딩을 마치고 다음 6 개월 동안 프로덕션 서버에서 테스트했습니다. 현재 배포 후 6 개월 만에 HipHop을 사용하여 웹 트래픽의 90 % 이상을 서비스하고 있다고 자랑스럽게 생각합니다.

HipHop 작동 방식

이 프로젝트의 주요 과제는 PHP와 C ++ 간의 격차를 해소하는 것이 었습니다. PHP는 역동적이고 약한 타이핑이있는 스크립팅 언어입니다. C ++는 정적 타이핑이있는 컴파일 된 언어입니다. PHP를 사용하면 마술 같은 동적 기능을 작성할 수 있지만 대부분의 PHP는 비교적 간단합니다. 당신이 보는 if (...) {...} else {..}것보다 더 가능성이 높습니다 function foo($x) { include $x; }. 여기에서 성능이 향상됩니다. 가능할 때마다 생성 된 코드는 함수와 변수에 정적 바인딩을 사용합니다. 또한 유형 유추를 사용하여 변수에 가능한 가장 구체적인 유형을 선택하여 메모리를 절약합니다.

변환 프로세스에는 세 가지 주요 단계가 포함됩니다.

  1. 누가 무엇과 의존성을 선언하는지에 대한 정보를 수집하는 정적 분석
  2. C ++ 스칼라, 문자열, 배열, 클래스, 객체 및 변형 중에서 가장 구체적인 유형을 선택하는 유형 유추
  3. 대부분의 경우 PHP 문과 표현식에서 C ++ 문과 표현식에 직접 대응하는 코드 생성입니다.

또한 HPHPi는 개발 용으로 설계된 실험 통역사입니다. HPHPi를 사용하는 경우 PHP 소스 코드를 컴파일하기 전에 컴파일 할 필요가 없습니다. HipHop 자체에서 버그를 발견하고 엔지니어가 PHP 작성 방식을 변경하지 않고 HipHop을 사용할 수있는 방법을 제공합니다.

전반적인 HipHop을 사용하면 C ++의 성능 이점을 활용하면서 PHP의 장점을 최대한 활용할 수 있습니다. 총 30 만 줄의 코드와 5,000 개 이상의 단위 테스트를 작성했습니다.


4
이것은 약간의 색상이 좋았을 수도 있지만 기본적으로 성능에 달려 있습니다. 그들은 응용 프로그램의 확장 성을 원하지만 PHP에 능숙한 사람들이 있고 PHP가 더 생산적이라고 생각합니다. 따라서이 솔루션을 사용하면 C의 성능으로 PHP를 단순하게 만들 수 있습니다. 코드베이스가 너무 커서 수동으로 변환 할 수 없습니다.
Cervo

13

짧은 대답-아니요, C ++이 필요 하지 않습니다 .

나는 당신이 HipHop을 언급하고 있다고 생각합니다 . 개선 사항에 대해 읽으면 약 50 %입니다. 수천 개의 프론트 엔드 서버가있는 Facebook 인 경우 매우 중요합니다. 부하를 줄이면 수백만 개의 데이터 센터 비용이 절감됩니다. 프런트 엔드 서버가 10 ~ 100 대인 회사의 경우 개발 비용이 훨씬 비 축적입니다. 어쨌든 가장 많은 처리가 백엔드에서 수행되는데, 이는 일반적으로 고도로 최적화 된 C / C ++ 코드로 개발 된 일부 RDBMS 또는 NoSQL 솔루션입니다.

물론 PHP를 완전히 덤프하면 훨씬 더 많은 비용을 절감 할 수있었습니다. 그러나 페이스 북의 경우와 같이 거대한 코드베이스로 할 수있는 것은 아닙니다.

이제 질문의 다른 부분에 대해 : 막대한 부하를 처리하는 방법을 실제로 알고 싶다면 High Scalability 블로그 (특히 실생활 아키텍처) 부분을 읽으십시오 .

PHP로 가능하지만 확실히 내 선택이 아닐 것입니다. 동적 언어를 원한다면 Python, Ruby 또는 Lua가 훨씬 더 나은 선택입니다.


2
+1이지만 확장 성은 실제로 사용되는 언어와 관련이 없습니다. 데이터베이스 아키텍처는 훨씬 더 큰 베어링을 가지고 있습니다.
dan_waterworth

1
@ Dan : 그것이 내가 말하는 이유입니다-PHP로 가능합니다.
vartec

2
@Trinidad가 인용 한 블로그 항목에 따르면 최대 50 %가 아니라 평균 향상 이 50 %입니다 .
Jerry Coffin

2
@Jerry : 맞습니다. 그러나 여전히 C ++과 PHP의 실제 성능 차이와는 거리가 멀습니다.
vartec

6

FB의 접근 방식에 대한 좋은 점은 바로 결정할 필요가 없다는 것입니다. 당신도 똑같이해야합니다. 생산성을 높이는 언어를 선택하되 C / C ++와 쉽게 인터페이스되는지 확인하십시오.

수백만 명의 사용자가 있고 응답 시간을 밀리 초로 줄여야하는 경우 C / C ++를 사용하여 중요한 경로를 최적화 할 수 있습니다.


0

Facebook에서 사용하는 C ++ 요소는 HHVM입니다.

이것이 HIPHOP 가상 머신입니다. C ++로 작성되었지만 본질적으로 "더 나은 PHP 해석기"입니다.

PHP 코드는 바이트 코드로 컴파일 된 후 실행 시간에 HHVM에 의해 해석되며 "Just In Time"최적화가 적용됩니다.

페이스 북의 개발자는 여전히 대부분 PHP로 작성하며 브라우저에서 볼 수있는 것은 PHP 프로그램에 의해 거의 확실하게 출력됩니다.

실제 HHVM은 무료로 제공되는 오픈 소스입니다. 따라서 시간당 백만 개의 귀여운 새끼 고양이 사진을 제공 해야하는 경우 HHVM을 다운로드하고 PHP를 최소한으로 변경하여 서버 속도를 높일 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.