ทำไม Facebook ถึงใช้ C ++ ข้าง PHP? [ปิด]


15

อะไรคือสาเหตุหลักที่ทำให้ Facebook ต้องใช้ C ++ นอกเหนือจาก PHP ฉันสงสัยว่าถ้าฉันสร้างเว็บไซต์ด้วย vistor จำนวนมากฉันจะต้องใช้ C ++ ด้วยหรือไม่


อาจเป็นไปได้สำหรับกระบวนการแบ็คเอนด์ แต่คุณคงคลั่งไคล้ในการพัฒนาเว็บไซต์เป็นประจำ
ChaosPandion

1
คำถามprogrammers.stackexchange.com/questions/53624/ …ยังกล่าวถึงปัญหานี้อีกด้วย คุณอาจต้องการดูมัน
Vitor Py

4
เหตุใด Google จึงเขียนเซิร์ฟเวอร์ใน C ++
งาน

1
@Job และ Java และ Python
rightfold

5
@WTP สำหรับความรู้ของฉัน Python ใช้เพื่อวัตถุประสงค์ในการสร้างต้นแบบคุณสมบัติใหม่และทดสอบพวกเขาออก เมื่อโหลดของผู้ใช้สูงและสิ่งต่าง ๆ ต้องทำงานเร็วเท่าที่จะทำได้รหัส Python จะถูกแทนที่ด้วยรหัส C ++ ฉันค่อนข้างแน่ใจว่าความแตกต่างของความเร็วเพียง 1.2 นั้นเป็นเรื่องใหญ่สำหรับเซิร์ฟเวอร์ที่ต้องเผชิญกับผู้ใช้หลายร้อยล้านคน
งาน

คำตอบ:


20

นี่คือเหตุผล: HipHop สำหรับ PHP: ย้ายอย่างรวดเร็ว :

หนึ่งในค่านิยมที่สำคัญของ Facebook คือการก้าวไปอย่างรวดเร็ว ในช่วงหกปีที่ผ่านมาเราสามารถประสบความสำเร็จได้อย่างมากด้วยการพัฒนาอย่างรวดเร็วที่ PHP เสนอ ในฐานะที่เป็นภาษาโปรแกรม PHP นั้นเรียบง่าย ง่ายต่อการเรียนรู้ง่ายต่อการเขียนง่ายต่อการอ่านและง่ายต่อการตรวจแก้จุดบกพร่อง เราสามารถทำให้วิศวกรใหม่กระโจนเข้าสู่ Facebook ได้เร็วขึ้นด้วย PHP มากกว่าเมื่อเทียบกับภาษาอื่นซึ่งช่วยให้เราสามารถคิดค้นได้เร็วขึ้น

วันนี้ฉันตื่นเต้นที่จะแบ่งปันโครงการนี้ให้กับทีมงานที่น่าทึ่งของคนจำนวนมากและฉันได้ทำงานในช่วงสองปีที่ผ่านมา HipHop สำหรับ PHP ด้วย HipHop เราได้ลดการใช้งาน CPU บนเว็บเซิร์ฟเวอร์โดยเฉลี่ยประมาณห้าสิบเปอร์เซ็นต์ขึ้นอยู่กับหน้าเว็บ CPU น้อยลงหมายถึงเซิร์ฟเวอร์น้อยลงซึ่งหมายถึงค่าใช้จ่ายน้อยลง โครงการนี้มีผลกระทบอย่างมากต่อ Facebook เรารู้สึกว่าเว็บขนาดใหญ่จะได้ประโยชน์จาก HipHop ดังนั้นเราจึงเปิดตัวในฐานะโอเพ่นซอร์สในเย็นวันนี้ด้วยความหวังว่ามันจะนำมาซึ่งการมุ่งเน้นไปที่การปรับขนาดเว็บไซต์ที่ซับซ้อนขนาดใหญ่ด้วย PHP ในขณะที่ HipHop แสดงผลลัพธ์ที่น่าเหลือเชื่อแก่เรา แต่ก็ไม่สมบูรณ์และคุณควรจะคุ้นเคยกับซอฟต์แวร์เบต้าก่อนที่จะลองใช้

HipHop สำหรับ PHP ไม่ได้เป็นคอมไพเลอร์ในทางเทคนิค ค่อนข้างเป็นหม้อแปลงซอร์สโค้ด HipHop โปรแกรมแปลงซอร์สโค้ด PHP ของคุณเป็น C ++ ที่ได้รับการปรับแต่งแล้วใช้ g ++ เพื่อคอมไพล์มัน HipHop เรียกใช้ซอร์สโค้ดในลักษณะที่มีความหมายเท่าเทียมกันและเสียสละคุณลักษณะที่ใช้บ่อย ๆ เช่น Eval () เพื่อแลกกับประสิทธิภาพที่เพิ่มขึ้น HipHop มีตัวแปลงรหัสการปรับใช้ระบบรันไทม์ของ PHP และการเขียนส่วนขยาย PHP ทั่วไปจำนวนมากเพื่อใช้ประโยชน์จากการปรับปรุงประสิทธิภาพเหล่านี้

ปรับขนาด PHP เป็นภาษาสคริปต์

รากของ PHP เป็นภาษาสคริปต์เช่น Perl, Python และ Ruby ซึ่งทั้งหมดนี้มีประโยชน์ที่สำคัญในแง่ของประสิทธิภาพการทำงานของโปรแกรมเมอร์และความสามารถในการทำซ้ำอย่างรวดเร็วเกี่ยวกับผลิตภัณฑ์ เปรียบเทียบกับภาษาที่คอมไพล์ดั้งเดิมเช่น C ++ และภาษาที่ตีความเช่น Java ในทางกลับกันภาษาสคริปต์เป็นที่รู้จักกันโดยทั่วไปว่ามีประสิทธิภาพน้อยลงเมื่อพูดถึงการใช้งาน CPU และหน่วยความจำ ด้วยเหตุนี้จึงเป็นเรื่องยากที่จะปรับขนาด Facebook ให้มีการดูหน้า PHP มากกว่า 400 พันล้านครั้งทุกเดือน

วิธีหนึ่งที่ใช้กันทั่วไปในการจัดการกับความไร้ประสิทธิภาพเหล่านี้คือการเขียนส่วนที่ซับซ้อนมากขึ้นของแอปพลิเคชั่น PHP ของคุณโดยตรงใน C ++ เป็น PHP Extensions ส่วนใหญ่จะแปลง PHP เป็นภาษากาวระหว่าง HTML ส่วนหน้าและตรรกะของแอปพลิเคชันใน C ++ จากมุมมองทางเทคนิคสิ่งนี้ใช้ได้ดี แต่ลดจำนวนวิศวกรที่สามารถทำงานกับแอปพลิเคชันทั้งหมดของคุณได้อย่างมาก การเรียนรู้ C ++ เป็นเพียงขั้นตอนแรกในการเขียนส่วนขยาย PHP ส่วนที่สองคือการเข้าใจ Zend API เนื่องจากทีมวิศวกรของเรามีขนาดค่อนข้างเล็ก - มีวิศวกรมากกว่าหนึ่งล้านคนต่อผู้ใช้ - เราไม่สามารถทำให้ส่วนของ codebase ของเราเข้าถึงได้น้อยกว่าคนอื่น

การปรับสเกล Facebook นั้นมีความท้าทายเป็นพิเศษเพราะการดูหน้าเว็บเกือบทุกครั้งเป็นผู้ใช้ที่ลงชื่อเข้าใช้และมีประสบการณ์ที่กำหนดเอง เมื่อคุณดูโฮมเพจของคุณเราจำเป็นต้องค้นหาเพื่อนทั้งหมดของคุณค้นหาการปรับปรุงที่เกี่ยวข้องมากที่สุดของพวกเขา (จากบริการที่กำหนดเองที่เราสร้างขึ้นชื่อ Multifeed) กรองผลลัพธ์ตามการตั้งค่าความเป็นส่วนตัวของคุณจากนั้นกรอกเรื่องราวด้วยความคิดเห็น , ภาพถ่าย, รายการที่ชอบ, และข้อมูลที่มีคุณค่าทั้งหมดที่ผู้คนชื่นชอบเกี่ยวกับ Facebook ทั้งหมดนี้ใช้เวลาเพียงไม่กี่วินาที HipHop ช่วยให้เราสามารถเขียนตรรกะที่ทำชุดประกอบหน้าสุดท้ายใน PHP และวนซ้ำอย่างรวดเร็วในขณะที่พึ่งพาบริการแบ็คเอนด์ที่กำหนดเองใน C ++, Erlang, Java หรือ Python เพื่อให้บริการฟีดข่าวการค้นหาการแชทและส่วนหลักอื่น ๆ ของเว็บไซต์

ตั้งแต่ปี 2550 เราได้คิดถึงวิธีที่แตกต่างกันสองสามวิธีในการแก้ปัญหาเหล่านี้ คำแนะนำทั่วไปคือเพียงแค่เขียน Facebook ใหม่ในภาษาอื่น แต่ด้วยความซับซ้อนและความเร็วในการพัฒนาเว็บไซต์ซึ่งอาจต้องใช้เวลาสักระยะหนึ่ง เราได้เขียนแง่มุมใหม่ของ Zend Engine - ภายในของ PHP - และสนับสนุนการแก้ไขเหล่านั้นกลับเข้าไปในโครงการ PHP แต่ในที่สุดก็ไม่ได้เห็นการเพิ่มขึ้นของประสิทธิภาพที่จำเป็น ประโยชน์ของ HipHop นั้นเกือบจะโปร่งใสต่อการพัฒนาของเรา

การแฮ็กอัพ HipHop

คืนหนึ่งที่ Hackathon เมื่อไม่กี่ปีที่ผ่านมา (ดู Prime Time Hack) ฉันเริ่มโค้ดชิ้นแรกที่เปลี่ยน PHP เป็น C ++ ภาษามีความคล้ายคลึงกันทางสัมพัทธ์และ C ++ มีประสิทธิภาพสูงกว่า PHP อย่างมากเมื่อพูดถึงการใช้งาน CPU และหน่วยความจำ แม้แต่ PHP เองก็ถูกเขียนใน C. เรารู้ว่ามันเป็นไปไม่ได้ที่จะเขียน codebase ทั้งหมดที่มีขนาดเท่านี้ได้สำเร็จ แต่สงสัยว่าจะเกิดอะไรขึ้นถ้าเราสร้างระบบขึ้นมาเพื่อเขียนโปรแกรม

การหาวิธีใหม่ในการปรับปรุงประสิทธิภาพ PHP ไม่ใช่แนวคิดใหม่ ณ รันไทม์ Zend Engine เปลี่ยนแหล่ง PHP ของคุณเป็น opcodes ซึ่งจะทำงานผ่าน Zend Virtual Machine โครงการโอเพนซอร์สเช่นแคช APC และ eAccelerator ผลลัพธ์นี้และถูกใช้โดยเว็บไซต์ PHP ขับเคลื่อนส่วนใหญ่ นอกจากนี้ยังมีเซิร์ฟเวอร์ Zend ซึ่งเป็นผลิตภัณฑ์เชิงพาณิชย์ซึ่งทำให้ PHP เร็วขึ้นผ่านการปรับแต่งและการแคชให้ดียิ่งขึ้น แต่เรากำลังคิดที่จะเปลี่ยนแหล่ง PHP โดยตรงเป็น C ++ ซึ่งสามารถเปลี่ยนเป็นรหัสเครื่องได้ แม้แต่การคอมไพล์ PHP ไม่ใช่แนวคิดใหม่โครงการโอเพ่นซอร์สเช่น Roadsend และ phc คอมไพล์ PHP เป็น C, Quercus คอมไพล์ PHP กับ Java และ Phalanger รวบรวม PHP เป็น. Net

จำเป็นต้องพูดมันใช้เวลานานกว่า Hackathon อันเดียว แปดเดือนต่อมาฉันมีรหัสเพียงพอที่จะแสดงให้เห็นว่าเป็นไปได้ที่จะทำงานได้เร็วขึ้นด้วยรหัสที่รวบรวม เราได้เพิ่ม Iain Proctor และ Minghui Yang เข้ากับทีมเพื่อเร่งความเร็วของโครงการ เราใช้เวลาสิบเดือนข้างหน้าเพื่อทำการเขียนโค้ดทั้งหมดและการทดสอบหกเดือนต่อไปนี้บนเซิร์ฟเวอร์ที่ใช้งานจริง เราภูมิใจที่จะบอกว่า ณ จุดนี้เราให้บริการมากกว่า 90% ของปริมาณการใช้งานเว็บโดยใช้ HipHop ทั้งหมดเพียงหกเดือนหลังจากการใช้งาน

HipHop ทำงานอย่างไร

ความท้าทายหลักของโครงการคือการลดช่องว่างระหว่าง PHP และ C ++ PHP เป็นภาษาสคริปต์ที่มีการพิมพ์แบบไดนามิกและอ่อนแอ C ++ เป็นภาษาที่รวบรวมด้วยการพิมพ์แบบคงที่ ในขณะที่ PHP อนุญาตให้คุณเขียนคุณสมบัติไดนามิกที่น่าอัศจรรย์ แต่ PHP ส่วนใหญ่นั้นค่อนข้างตรงไปตรงมา มันมีโอกาสมากขึ้นที่คุณเห็นกว่าก็คือการดูif (...) {...} else {..} function foo($x) { include $x; }นี่คือสิ่งที่เราได้รับจากการแสดง เมื่อใดก็ตามที่เป็นไปได้รหัสที่เราสร้างขึ้นจะใช้การเชื่อมโยงแบบคงที่สำหรับฟังก์ชั่นและตัวแปร นอกจากนี้เรายังใช้การอนุมานประเภทเพื่อเลือกประเภทที่เจาะจงที่สุดเท่าที่จะเป็นไปได้สำหรับตัวแปรของเราและทำให้ประหยัดหน่วยความจำ

กระบวนการเปลี่ยนแปลงประกอบด้วยสามขั้นตอนหลัก:

  1. การวิเคราะห์แบบคงที่ที่เรารวบรวมข้อมูลเกี่ยวกับผู้ประกาศสิ่งที่และการอ้างอิง
  2. การอนุมานประเภทที่เราเลือกประเภทที่เฉพาะเจาะจงมากที่สุดระหว่างสเกลาร์ C ++, สตริง, อาเรย์, คลาส, วัตถุและตัวแปรและ
  3. การสร้างรหัสซึ่งส่วนใหญ่เป็นการโต้ตอบโดยตรงจากคำสั่ง PHP และการแสดงออกถึงคำสั่ง C ++ และการแสดงออก

เรายังพัฒนา HPHPi ซึ่งเป็นล่ามทดลองที่ออกแบบมาเพื่อการพัฒนา เมื่อใช้ HPHPi คุณไม่จำเป็นต้องรวบรวมซอร์สโค้ด PHP ของคุณก่อนเรียกใช้ มันช่วยให้เราสามารถตรวจจับข้อบกพร่องใน HipHop ได้และช่วยให้วิศวกรมีวิธีการใช้ HipHop โดยไม่เปลี่ยนวิธีการเขียน PHP

โดยรวม HipHop ช่วยให้เรารักษาส่วนที่ดีที่สุดของ PHP ในขณะที่ใช้ประโยชน์จากประสิทธิภาพการทำงานของ C ++ โดยรวมแล้วเราเขียนโค้ดมากกว่า 300,000 บรรทัดและทดสอบมากกว่า 5,000 หน่วย


4
นี่คือคำตอบสีเล็ก ๆ น่าจะดี แต่โดยพื้นฐานแล้วมันก็มีประสิทธิภาพ พวกเขาต้องการให้แอพพลิเคชั่นของพวกเขาขยายขนาดได้ดีขึ้น แต่พวกเขายังมีคนที่มีทักษะใน PHP มากขึ้นและรู้สึกว่า PHP ทำให้พวกเขามีประสิทธิผลมากขึ้น ดังนั้นวิธีการแก้ปัญหาช่วยให้ความเรียบง่ายของ PHP กับประสิทธิภาพของ C. ฐานรหัสของพวกเขามีขนาดใหญ่เกินไปที่จะแปลด้วยตนเองต่อไป
Cervo

13

คำตอบสั้น ๆ - ไม่คุณไม่จำเป็นต้องใช้ C ++

ผมเชื่อว่าคุณกำลังหมายถึงฮิปฮอป หากคุณอ่านเกี่ยวกับการปรับปรุงที่ให้มาจะมีค่าประมาณ 50% สิ่งนี้สำคัญมากหากคุณเป็น Facebook ซึ่งมีเซิร์ฟเวอร์ส่วนหน้านับพัน การลดภาระให้กับพวกเขาหมายถึงการลดต้นทุนของศูนย์ข้อมูลนับล้าน ในกรณีของ บริษัท ที่มีเซิร์ฟเวอร์ส่วนหน้า 10-100 ค่าใช้จ่ายในการพัฒนาจะประหยัดได้มาก อย่างไรก็ตามการประมวลผลที่หนักที่สุดนั้นทำในแบ็คเอนด์ซึ่งโดยปกติจะเป็นโซลูชัน RDBMS หรือ NoSQL ซึ่งได้รับการพัฒนาเป็นโค้ด C / C ++ ที่ปรับให้เหมาะสมที่สุด

แน่นอนว่าการประหยัดได้มากขึ้นนั้นทำได้เพียงแค่ทิ้ง PHP ไว้อย่างสมบูรณ์ แต่นั่นไม่ใช่สิ่งที่คุณสามารถทำได้กับฐานรหัสขนาดใหญ่เช่นเดียวกับในกรณีของ Facebook

ตอนนี้สำหรับส่วนอื่น ๆ ของคำถาม: หากคุณต้องการทราบวิธีจัดการกับโหลดจำนวนมากจริงๆให้อ่านบล็อก High Scalabilityโดยเฉพาะส่วน Real Life Architectureures

เป็นไปได้กับ PHP แต่แน่นอนจะไม่เป็นทางเลือกของฉัน หากคุณต้องการภาษาแบบไดนามิก, Python, Ruby หรือ Lua อาจเป็นทางเลือกที่ดีกว่ามาก


2
+1 แต่ความสามารถในการปรับขนาดนั้นไม่เกี่ยวกับภาษาที่ใช้ สถาปัตยกรรมฐานข้อมูลมีแบริ่งที่ใหญ่กว่ามาก
dan_waterworth

1
@ แดน: นั่นคือเหตุผลที่ฉันพูด - เป็นไปได้ด้วย PHP
vartec

2
ตามรายการในบล็อก @Trinidad อ้างว่า 50% เป็นการปรับปรุงโดยเฉลี่ยไม่ใช่จำนวนสูงสุด
Jerry Coffin

2
@Jerry: ใช่ แต่มันก็ยังห่างไกลจากความแตกต่างของประสิทธิภาพที่แท้จริงระหว่าง C ++ และ PHP
vartec

6

สิ่งที่ดีเกี่ยวกับวิธีการของ FB คือพวกเขาไม่ต้องตัดสินใจทันที คุณควรทำเช่นเดียวกัน เลือกภาษาที่ทำให้คุณมีประสิทธิผลมากที่สุด แต่ต้องแน่ใจว่ามันเชื่อมต่อกับ C / C ++ ได้อย่างง่ายดาย

เมื่อคุณมีผู้ใช้หลายล้านคนและต้องการลดเวลาในการตอบสนองเป็นมิลลิวินาทีคุณสามารถปรับเส้นทางที่สำคัญโดยใช้ C / C ++


0

องค์ประกอบ C ++ ที่ Facebook ใช้คือ HHVM

นั่นคือเครื่องเสมือน HIPHOP แม้ว่าจะเขียนด้วยภาษาซีพลัสพลัสมันเป็น "ล่าม PHP ที่ดีกว่า"

โค้ด php ถูกคอมไพล์เป็นรหัสไบต์ซึ่งจะถูกตีความโดย HHVM ณ เวลาดำเนินการและอยู่ภายใต้การปรับให้เหมาะสม "Just In Time" ในขณะที่ทำงาน

นักพัฒนาที่หน้าหนังสือส่วนใหญ่ยังคงเขียนใน PHP และสิ่งที่คุณเห็นในเบราว์เซอร์ของคุณจะถูกส่งออกโดยโปรแกรม PHP เกือบทั้งหมดจะถูกรวบรวมและตีความโดยรันไทม์ HHVM

HHVM จริงเป็นโอเพ่นซอร์สที่สามารถใช้ได้อย่างอิสระ ดังนั้นหากคุณจำเป็นต้องให้บริการภาพลูกแมวน่ารักหนึ่งล้านภาพต่อชั่วโมงคุณสามารถดาวน์โหลด HHVM และเร่งความเร็วเซิร์ฟเวอร์ของคุณด้วยการเปลี่ยน PHP ของคุณเพียงเล็กน้อย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.