Tại sao Facebook sử dụng C ++ bên cạnh PHP? [đóng cửa]


15

Lý do chính khiến Facebook cần sử dụng C ++ bên cạnh PHP là gì? Tôi tự hỏi nếu tôi làm một trang web với rất nhiều khách hàng thì tôi có cần sử dụng C ++ không?


Có thể cho các quy trình back-end nhưng bạn sẽ phát điên khi phát triển web thường xuyên với nó.
ChaosPandion

1
Câu hỏi lập trình.stackexchange.com/ questions/ 53624/ cũng thảo luận về vấn đề này. Bạn có thể muốn xem nó.
Vitor Py

4
Tại sao Google viết máy chủ của họ bằng C ++?
Công việc

1
@Job và Java và Python.
đúng

5
@WTP, theo hiểu biết của tôi Python được sử dụng cho mục đích tạo mẫu các tính năng mới và thử nghiệm chúng. Khi tải người dùng trở nên cao và mọi thứ cần phải hoạt động nhanh nhất có thể, mã Python sẽ được thay thế bằng mã C ++. Tôi khá chắc chắn rằng sự khác biệt về tốc độ nhỏ như 1,2 là một vấn đề lớn đối với các máy chủ phải đối mặt với hàng trăm triệu người dùng.
Công việc

Câu trả lời:


20

Đây là lý do: HipHop cho PHP: Di chuyển nhanh :

Một trong những giá trị quan trọng tại Facebook là di chuyển nhanh. Trong sáu năm qua, chúng tôi đã có thể đạt được rất nhiều nhờ tốc độ phát triển nhanh chóng mà PHP cung cấp. Là một ngôn ngữ lập trình, PHP rất đơn giản. Đơn giản để học, đơn giản để viết, đơn giản để đọc và đơn giản để gỡ lỗi. Chúng tôi có thể khiến các kỹ sư mới phát triển nhanh hơn tại Facebook với PHP nhanh hơn nhiều so với các ngôn ngữ khác, điều này cho phép chúng tôi đổi mới nhanh hơn.

Hôm nay tôi rất vui mừng được chia sẻ dự án một nhóm nhỏ những người tuyệt vời và tôi đã làm việc trong hai năm qua; HipHop cho PHP. Với HipHop, chúng tôi đã giảm mức sử dụng CPU trên các máy chủ Web của chúng tôi trung bình khoảng năm mươi phần trăm, tùy thuộc vào trang. CPU ít hơn có nghĩa là ít máy chủ hơn, có nghĩa là ít chi phí hơn. Dự án này đã có một tác động to lớn trên Facebook. Chúng tôi cảm thấy Web nói chung có thể hưởng lợi từ HipHop, vì vậy chúng tôi sẽ phát hành nó dưới dạng nguồn mở tối nay với hy vọng rằng nó mang lại một trọng tâm mới về việc nhân rộng các trang web phức tạp lớn với PHP. Mặc dù HipHop đã cho chúng ta thấy kết quả đáng kinh ngạc, nhưng nó chắc chắn chưa hoàn thành và bạn nên thoải mái với phần mềm beta trước khi dùng thử.

HipHop cho PHP về mặt kỹ thuật không phải là trình biên dịch. Thay vào đó là một biến áp mã nguồn. HipHop lập trình chuyển đổi mã nguồn PHP của bạn thành C ++ được tối ưu hóa cao và sau đó sử dụng g ++ để biên dịch nó. HipHop thực thi mã nguồn theo cách tương đương về mặt ngữ nghĩa và hy sinh một số tính năng hiếm khi được sử dụng - như eval () - để đổi lấy hiệu suất được cải thiện. HipHop bao gồm một trình biến đổi mã, triển khai lại hệ thống thời gian chạy của PHP và viết lại nhiều Phần mở rộng PHP phổ biến để tận dụng các tối ưu hóa hiệu suất này.

Mở rộng quy mô PHP như một ngôn ngữ kịch bản

Nguồn gốc của PHP là những ngôn ngữ kịch bản, như Perl, Python và Ruby, tất cả đều có lợi ích lớn về năng suất lập trình viên và khả năng lặp lại nhanh chóng trên các sản phẩm. Điều này được so sánh với các ngôn ngữ được biên dịch truyền thống hơn như C ++ và các ngôn ngữ được dịch như Java. Mặt khác, các ngôn ngữ script được biết là thường kém hiệu quả hơn khi sử dụng CPU và bộ nhớ. Vì điều này, thật khó khăn khi mở rộng Facebook lên hơn 400 tỷ lượt xem trang dựa trên PHP mỗi tháng.

Một cách phổ biến để giải quyết những sự thiếu hiệu quả này là viết lại các phần phức tạp hơn của ứng dụng PHP của bạn trực tiếp trong C ++ dưới dạng Phần mở rộng PHP. Điều này phần lớn biến PHP thành ngôn ngữ kết dính giữa HTML ứng dụng và logic ứng dụng trong C ++. Từ góc độ kỹ thuật, nó hoạt động tốt, nhưng làm giảm đáng kể số lượng kỹ sư có khả năng làm việc trên toàn bộ ứng dụng của bạn. Học C ++ chỉ là bước đầu tiên để viết Phần mở rộng PHP, thứ hai là hiểu API Zend. Cho rằng nhóm kỹ sư của chúng tôi tương đối nhỏ - có hơn một triệu người dùng cho mỗi kỹ sư - chúng tôi không thể đủ khả năng để làm cho các phần của cơ sở mã của chúng tôi khó truy cập hơn những người khác.

Mở rộng Facebook đặc biệt khó khăn vì hầu hết mọi lượt xem trang là người dùng đăng nhập với trải nghiệm tùy chỉnh. Khi bạn xem trang chủ của mình, chúng tôi cần tìm kiếm tất cả bạn bè của bạn, truy vấn các bản cập nhật phù hợp nhất của họ (từ một dịch vụ tùy chỉnh mà chúng tôi đã xây dựng có tên là Multifeed), lọc kết quả dựa trên cài đặt quyền riêng tư của bạn, sau đó điền vào các câu chuyện bằng các bình luận , ảnh, lượt thích và tất cả dữ liệu phong phú mà mọi người yêu thích trên Facebook. Tất cả điều này chỉ trong chưa đầy một giây. HipHop cho phép chúng ta viết logic thực hiện việc lắp ráp trang cuối cùng trong PHP và lặp lại nhanh chóng trong khi dựa vào các dịch vụ back-end tùy chỉnh trong C ++, Erlang, Java hoặc Python để phục vụ News Feed, tìm kiếm, Trò chuyện và các phần cốt lõi khác của trang web.

Từ năm 2007, chúng tôi đã nghĩ về một vài cách khác nhau để giải quyết những vấn đề này và thậm chí đã thử thực hiện một vài trong số chúng. Gợi ý phổ biến là chỉ viết lại Facebook bằng một ngôn ngữ khác, nhưng với sự phức tạp và tốc độ phát triển của trang web, điều này sẽ mất một thời gian để hoàn thành. Chúng tôi đã viết lại các khía cạnh của Zend Engine - phần bên trong của PHP - và đã đóng góp các bản vá đó lại cho dự án PHP, nhưng cuối cùng vẫn chưa thấy loại tăng hiệu suất cần thiết. Lợi ích của HipHop gần như minh bạch đối với tốc độ phát triển của chúng tôi.

Hack lên HipHop

Một đêm tại Hackathon vài năm trước (xem Prime Time Hack), tôi bắt đầu đoạn mã đầu tiên chuyển đổi PHP thành C ++. Các ngôn ngữ khá giống nhau về mặt cú pháp và C ++ vượt trội hoàn toàn so với PHP khi nói đến cả việc sử dụng CPU và bộ nhớ. Ngay cả bản thân PHP cũng được viết bằng C. Chúng tôi biết rằng không thể viết lại thành công toàn bộ một cơ sở mã có kích thước này bằng tay, nhưng tự hỏi điều gì sẽ xảy ra nếu chúng tôi xây dựng một hệ thống để thực hiện theo lập trình.

Tìm cách mới để cải thiện hiệu năng PHP không phải là một khái niệm mới. Trong thời gian chạy, Zend Engine biến nguồn PHP của bạn thành các opcode sau đó chạy qua Máy ảo Zend. Các dự án nguồn mở như APC và eAccelerator lưu trữ đầu ra này và được phần lớn các trang web hỗ trợ PHP sử dụng. Ngoài ra còn có Zend Server, một sản phẩm thương mại giúp PHP nhanh hơn thông qua tối ưu hóa opcode và bộ nhớ đệm. Thay vào đó, chúng tôi đã suy nghĩ về việc chuyển đổi trực tiếp nguồn PHP thành C ++, sau đó có thể được chuyển thành mã máy gốc. Ngay cả việc biên dịch PHP cũng không phải là một ý tưởng mới, các dự án nguồn mở như Roadsend và phc biên dịch PHP thành C, Quercus biên dịch PHP sang Java và Phalanger biên dịch PHP thành .Net.

Không cần phải nói, nó mất nhiều thời gian hơn so với Hackathon đơn lẻ đó. Tám tháng sau, tôi đã có đủ mã để chứng minh rằng thực sự có thể chạy nhanh hơn với mã được biên dịch. Chúng tôi nhanh chóng bổ sung Iain Proctor và Minghui Yang vào nhóm để đẩy nhanh tiến độ của dự án. Chúng tôi đã dành mười tháng tiếp theo để hoàn thành tất cả mã hóa và sáu tháng tiếp theo thử nghiệm trên các máy chủ sản xuất. Chúng tôi tự hào nói rằng tại thời điểm này, chúng tôi đang phục vụ hơn 90% lưu lượng truy cập Web của chúng tôi bằng HipHop, tất cả chỉ sáu tháng sau khi triển khai.

HipHop hoạt động như thế nào

Thách thức chính của dự án là thu hẹp khoảng cách giữa PHP và C ++. PHP là một ngôn ngữ kịch bản với kiểu gõ năng động, yếu. C ++ là một ngôn ngữ được biên dịch với kiểu gõ tĩnh. Trong khi PHP cho phép bạn viết các tính năng động kỳ diệu, hầu hết PHP tương đối đơn giản. Có nhiều khả năng bạn nhìn thấy if (...) {...} else {..}hơn là nhìn thấy function foo($x) { include $x; }. Đây là nơi chúng tôi đạt được trong hiệu suất. Bất cứ khi nào có thể, mã được tạo của chúng tôi sử dụng liên kết tĩnh cho các hàm và biến. Chúng tôi cũng sử dụng suy luận kiểu để chọn loại cụ thể nhất có thể cho các biến của mình và do đó tiết kiệm bộ nhớ.

Quá trình chuyển đổi bao gồm ba bước chính:

  1. Phân tích tĩnh nơi chúng tôi thu thập thông tin về người tuyên bố những gì và phụ thuộc,
  2. Nhập suy luận trong đó chúng tôi chọn loại cụ thể nhất giữa các vô hướng C ++, Chuỗi, Mảng, lớp, Đối tượng và Biến thể, và
  3. Việc tạo mã mà phần lớn là sự tương ứng trực tiếp từ các câu lệnh và biểu thức PHP đến các câu lệnh và biểu thức C ++.

Chúng tôi cũng đã phát triển HPHPi, một trình thông dịch thử nghiệm được thiết kế để phát triển. Khi sử dụng HPHPi, bạn không cần phải biên dịch mã nguồn PHP trước khi chạy nó. Nó đã giúp chúng tôi bắt lỗi trong chính HipHop và cung cấp cho các kỹ sư cách sử dụng HipHop mà không thay đổi cách họ viết PHP.

Nhìn chung, HipHop cho phép chúng tôi giữ các khía cạnh tốt nhất của PHP trong khi tận dụng các lợi ích hiệu năng của C ++. Tổng cộng, chúng tôi đã viết hơn 300.000 dòng mã và hơn 5.000 bài kiểm tra đơn vị.


4
Đây là câu trả lời, một chút màu sắc sẽ là tốt đẹp, nhưng về cơ bản nó đi xuống hiệu suất. Họ muốn ứng dụng của họ mở rộng quy mô tốt hơn, nhưng họ cũng có nhiều người có kỹ năng hơn về PHP và cảm thấy PHP làm cho họ hiệu quả hơn. Vì vậy, giải pháp cho phép sự đơn giản của PHP với hiệu năng của C. Cơ sở mã của họ quá lớn để tự dịch nó.
Cervo

13

Trả lời ngắn gọn - không, bạn không cần C ++.

Tôi tin rằng bạn đang đề cập đến HipHop . Nếu bạn đọc về những cải tiến mà nó mang lại, đó là khoảng 50%. Điều này rất quan trọng nếu bạn là Facebook có hàng ngàn máy chủ lối vào. Cắt giảm tải có nghĩa là hàng triệu trong tiết kiệm chi phí trung tâm dữ liệu. Trong trường hợp công ty có 10 - 100 máy chủ frontend, chi phí phát triển sẽ tiết kiệm rất nhiều. Dù sao, việc xử lý nặng nhất được thực hiện ở back-end, thường là một số giải pháp RDBMS hoặc NoQuery, được phát triển dưới dạng mã C / C ++ được tối ưu hóa cao.

Tất nhiên, có thể đã đạt được mức tiết kiệm cao hơn nhiều khi chỉ cần bỏ hoàn toàn PHP. Nhưng đó không phải là điều bạn có thể làm với cơ sở mã lớn, như trong trường hợp của Facebook.

Bây giờ, đối với phần khác của câu hỏi: nếu bạn thực sự muốn biết làm thế nào để đối phó với tải trọng lớn, hãy đọc blog Khả năng mở rộng cao , đặc biệt là phần Kiến trúc cuộc sống thực.

Có thể với PHP, nhưng chắc chắn sẽ không phải là lựa chọn của tôi. Nếu bạn muốn ngôn ngữ động, Python, Ruby hoặc có thể Lua sẽ là lựa chọn tốt hơn nhiều.


2
+1, nhưng khả năng mở rộng thực tế không liên quan gì đến ngôn ngữ được sử dụng. Các kiến ​​trúc cơ sở dữ liệu có mang lớn hơn nhiều.
dan_waterworth

1
@Dan: đó là lý do tại sao tôi nói - có thể với PHP.
vartec

2
Theo mục blog @Trinidad trích dẫn, 50% là mức cải thiện trung bình , không phải là mức tối đa.
Jerry Coffin

2
@Jerry: đúng, nhưng vẫn còn rất, rất xa sự khác biệt về hiệu năng thực tế giữa C ++ và PHP.
vartec

6

Điều hay ho về cách tiếp cận của FB là họ không phải quyết định ngay lập tức. Bạn nên làm như vậy. Chọn ngôn ngữ giúp bạn làm việc hiệu quả nhất, nhưng hãy chắc chắn rằng nó giao tiếp dễ dàng với C / C ++.

Khi bạn có hàng triệu người dùng và cần loại bỏ hàng nghìn giây thời gian phản hồi, bạn có thể tối ưu hóa các đường dẫn quan trọng bằng C / C ++.


0

Phần tử C ++ được Facebook sử dụng là HHVM.

Đó là máy ảo HIPHOP. Mặc dù được viết bằng C ++ nhưng về cơ bản nó là một "trình thông dịch PHP tốt hơn".

Mã php được biên dịch thành mã byte, sau đó được HHVM giải thích tại thời điểm thực thi và chịu sự tối ưu hóa "Just In Time" khi nó chạy.

Các nhà phát triển tại face book vẫn viết chủ yếu bằng PHP và, những gì bạn thấy trên trình duyệt của bạn gần như chắc chắn được xuất ra bởi một chương trình PHP - mặc dù đã được biên dịch và giải thích bởi bộ thực thi HHVM.

HHVM thực tế là nguồn mở có sẵn miễn phí. Vì vậy, nếu bạn cần phục vụ một triệu bức ảnh mèo con dễ thương mỗi giờ thì bạn có thể tải xuống HHVM và tăng tốc máy chủ của bạn với sự thay đổi tối thiểu đối với PHP của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.