อะไรคือสาเหตุหลักที่ทำให้ Facebook ต้องใช้ C ++ นอกเหนือจาก PHP ฉันสงสัยว่าถ้าฉันสร้างเว็บไซต์ด้วย vistor จำนวนมากฉันจะต้องใช้ C ++ ด้วยหรือไม่
อะไรคือสาเหตุหลักที่ทำให้ Facebook ต้องใช้ C ++ นอกเหนือจาก PHP ฉันสงสัยว่าถ้าฉันสร้างเว็บไซต์ด้วย vistor จำนวนมากฉันจะต้องใช้ C ++ ด้วยหรือไม่
คำตอบ:
นี่คือเหตุผล: 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; }
นี่คือสิ่งที่เราได้รับจากการแสดง เมื่อใดก็ตามที่เป็นไปได้รหัสที่เราสร้างขึ้นจะใช้การเชื่อมโยงแบบคงที่สำหรับฟังก์ชั่นและตัวแปร นอกจากนี้เรายังใช้การอนุมานประเภทเพื่อเลือกประเภทที่เจาะจงที่สุดเท่าที่จะเป็นไปได้สำหรับตัวแปรของเราและทำให้ประหยัดหน่วยความจำกระบวนการเปลี่ยนแปลงประกอบด้วยสามขั้นตอนหลัก:
- การวิเคราะห์แบบคงที่ที่เรารวบรวมข้อมูลเกี่ยวกับผู้ประกาศสิ่งที่และการอ้างอิง
- การอนุมานประเภทที่เราเลือกประเภทที่เฉพาะเจาะจงมากที่สุดระหว่างสเกลาร์ C ++, สตริง, อาเรย์, คลาส, วัตถุและตัวแปรและ
- การสร้างรหัสซึ่งส่วนใหญ่เป็นการโต้ตอบโดยตรงจากคำสั่ง PHP และการแสดงออกถึงคำสั่ง C ++ และการแสดงออก
เรายังพัฒนา HPHPi ซึ่งเป็นล่ามทดลองที่ออกแบบมาเพื่อการพัฒนา เมื่อใช้ HPHPi คุณไม่จำเป็นต้องรวบรวมซอร์สโค้ด PHP ของคุณก่อนเรียกใช้ มันช่วยให้เราสามารถตรวจจับข้อบกพร่องใน HipHop ได้และช่วยให้วิศวกรมีวิธีการใช้ HipHop โดยไม่เปลี่ยนวิธีการเขียน PHP
โดยรวม HipHop ช่วยให้เรารักษาส่วนที่ดีที่สุดของ PHP ในขณะที่ใช้ประโยชน์จากประสิทธิภาพการทำงานของ C ++ โดยรวมแล้วเราเขียนโค้ดมากกว่า 300,000 บรรทัดและทดสอบมากกว่า 5,000 หน่วย
คำตอบสั้น ๆ - ไม่คุณไม่จำเป็นต้องใช้ C ++
ผมเชื่อว่าคุณกำลังหมายถึงฮิปฮอป หากคุณอ่านเกี่ยวกับการปรับปรุงที่ให้มาจะมีค่าประมาณ 50% สิ่งนี้สำคัญมากหากคุณเป็น Facebook ซึ่งมีเซิร์ฟเวอร์ส่วนหน้านับพัน การลดภาระให้กับพวกเขาหมายถึงการลดต้นทุนของศูนย์ข้อมูลนับล้าน ในกรณีของ บริษัท ที่มีเซิร์ฟเวอร์ส่วนหน้า 10-100 ค่าใช้จ่ายในการพัฒนาจะประหยัดได้มาก อย่างไรก็ตามการประมวลผลที่หนักที่สุดนั้นทำในแบ็คเอนด์ซึ่งโดยปกติจะเป็นโซลูชัน RDBMS หรือ NoSQL ซึ่งได้รับการพัฒนาเป็นโค้ด C / C ++ ที่ปรับให้เหมาะสมที่สุด
แน่นอนว่าการประหยัดได้มากขึ้นนั้นทำได้เพียงแค่ทิ้ง PHP ไว้อย่างสมบูรณ์ แต่นั่นไม่ใช่สิ่งที่คุณสามารถทำได้กับฐานรหัสขนาดใหญ่เช่นเดียวกับในกรณีของ Facebook
ตอนนี้สำหรับส่วนอื่น ๆ ของคำถาม: หากคุณต้องการทราบวิธีจัดการกับโหลดจำนวนมากจริงๆให้อ่านบล็อก High Scalabilityโดยเฉพาะส่วน Real Life Architectureures
เป็นไปได้กับ PHP แต่แน่นอนจะไม่เป็นทางเลือกของฉัน หากคุณต้องการภาษาแบบไดนามิก, Python, Ruby หรือ Lua อาจเป็นทางเลือกที่ดีกว่ามาก
สิ่งที่ดีเกี่ยวกับวิธีการของ FB คือพวกเขาไม่ต้องตัดสินใจทันที คุณควรทำเช่นเดียวกัน เลือกภาษาที่ทำให้คุณมีประสิทธิผลมากที่สุด แต่ต้องแน่ใจว่ามันเชื่อมต่อกับ C / C ++ ได้อย่างง่ายดาย
เมื่อคุณมีผู้ใช้หลายล้านคนและต้องการลดเวลาในการตอบสนองเป็นมิลลิวินาทีคุณสามารถปรับเส้นทางที่สำคัญโดยใช้ C / C ++
องค์ประกอบ C ++ ที่ Facebook ใช้คือ HHVM
นั่นคือเครื่องเสมือน HIPHOP แม้ว่าจะเขียนด้วยภาษาซีพลัสพลัสมันเป็น "ล่าม PHP ที่ดีกว่า"
โค้ด php ถูกคอมไพล์เป็นรหัสไบต์ซึ่งจะถูกตีความโดย HHVM ณ เวลาดำเนินการและอยู่ภายใต้การปรับให้เหมาะสม "Just In Time" ในขณะที่ทำงาน
นักพัฒนาที่หน้าหนังสือส่วนใหญ่ยังคงเขียนใน PHP และสิ่งที่คุณเห็นในเบราว์เซอร์ของคุณจะถูกส่งออกโดยโปรแกรม PHP เกือบทั้งหมดจะถูกรวบรวมและตีความโดยรันไทม์ HHVM
HHVM จริงเป็นโอเพ่นซอร์สที่สามารถใช้ได้อย่างอิสระ ดังนั้นหากคุณจำเป็นต้องให้บริการภาพลูกแมวน่ารักหนึ่งล้านภาพต่อชั่วโมงคุณสามารถดาวน์โหลด HHVM และเร่งความเร็วเซิร์ฟเวอร์ของคุณด้วยการเปลี่ยน PHP ของคุณเพียงเล็กน้อย