Mengapa Facebook menggunakan C ++ di samping PHP? [Tutup]

15

Apa alasan utama yang membuat Facebook perlu menggunakan C ++ di samping PHP? Saya bertanya-tanya apakah saya membuat situs web dengan banyak pengunjung apakah saya perlu menggunakan C ++ juga?

Goma
sumber
Mungkin untuk proses back-end tetapi Anda akan gila untuk melakukan pengembangan web biasa dengannya.
ChaosPandion
1
Pertanyaan programmers.stackexchange.com/questions/53624/... juga membahas masalah ini. Anda mungkin ingin melihatnya.
Vitor Py
4
Mengapa Google menulis server mereka di C ++?
Pekerjaan
1
@ Pekerjaan dan Java dan Python.
sayap kanan
5
@ WTP, setahu saya Python digunakan untuk keperluan prototyping fitur baru dan mengujinya. Setelah beban pengguna menjadi tinggi dan hal-hal perlu bekerja secepat mungkin, kode Python akan diganti dengan kode C ++. Saya cukup yakin bahwa perbedaan kecepatan sekecil 1,2 adalah masalah besar untuk server yang menghadapi ratusan juta pengguna.
Ayub

Jawaban:

20

Inilah alasannya: HipHop untuk PHP: Bergerak Cepat :

Salah satu nilai kunci di Facebook adalah bergerak cepat. Selama enam tahun terakhir, kami telah dapat mencapai banyak hal berkat pesatnya perkembangan yang ditawarkan PHP. Sebagai bahasa pemrograman, PHP sederhana. Mudah dipelajari, mudah ditulis, mudah dibaca, dan mudah di-debug. Kami dapat membuat insinyur baru menggenjot Facebook jauh lebih cepat dengan PHP daripada dengan bahasa lain, yang memungkinkan kami untuk berinovasi lebih cepat.

Hari ini saya senang berbagi proyek dengan tim kecil orang-orang luar biasa dan saya telah bekerja selama dua tahun terakhir; HipHop untuk PHP. Dengan HipHop kami telah mengurangi penggunaan CPU pada server Web kami rata-rata sekitar lima puluh persen, tergantung pada halaman. Lebih sedikit CPU berarti lebih sedikit server, yang berarti lebih sedikit overhead. Proyek ini memiliki dampak luar biasa pada Facebook. Kami merasa Web pada umumnya dapat mengambil manfaat dari HipHop, jadi kami merilisnya sebagai open source malam ini dengan harapan bahwa itu membawa fokus baru menuju penskalaan situs web besar yang kompleks dengan PHP. Walaupun HipHop telah menunjukkan kepada kami hasil yang luar biasa, itu tentu saja tidak lengkap dan Anda harus merasa nyaman dengan perangkat lunak beta sebelum mencobanya.

HipHop untuk PHP secara teknis bukan kompiler itu sendiri. Sebaliknya itu adalah transformator kode sumber. HipHop secara program mengubah kode sumber PHP Anda menjadi C ++ yang sangat optimal dan kemudian menggunakan g ++ untuk mengompilasinya. HipHop mengeksekusi kode sumber dengan cara yang setara secara semantik dan mengorbankan beberapa fitur yang jarang digunakan - seperti eval () - sebagai imbalan untuk peningkatan kinerja. HipHop termasuk transformator kode, implementasi ulang sistem runtime PHP, dan penulisan ulang banyak ekstensi PHP umum untuk mengambil keuntungan dari optimasi kinerja ini.

Penskalaan PHP sebagai Bahasa Scripting

Akar PHP adalah bahasa scripting, seperti Perl, Python, dan Ruby, yang semuanya memiliki manfaat besar dalam hal produktivitas programmer dan kemampuan untuk beralih dengan cepat pada produk. Ini dibandingkan dengan bahasa kompilasi yang lebih tradisional seperti C ++ dan bahasa yang ditafsirkan seperti Java. Di sisi lain, bahasa scripting diketahui secara umum kurang efisien dalam hal penggunaan CPU dan memori. Karena itu, sulit untuk meningkatkan Facebook ke lebih dari 400 miliar tampilan halaman berbasis PHP setiap bulan.

Salah satu cara umum untuk mengatasi inefisiensi ini adalah dengan menulis ulang bagian yang lebih kompleks dari aplikasi PHP Anda secara langsung dalam C ++ sebagai Ekstensi PHP. Ini sebagian besar mengubah PHP menjadi bahasa lem antara HTML front end Anda dan logika aplikasi dalam C ++. Dari perspektif teknis ini berfungsi dengan baik, tetapi secara drastis mengurangi jumlah insinyur yang dapat bekerja pada seluruh aplikasi Anda. Belajar C ++ hanyalah langkah pertama untuk menulis Ekstensi PHP, yang kedua adalah memahami Zend API. Mengingat bahwa tim teknik kami relatif kecil - ada lebih dari satu juta pengguna untuk setiap insinyur - kami tidak mampu membuat bagian dari basis kode kami lebih mudah diakses daripada yang lain.

Menskal Facebook sangat menantang karena hampir setiap tampilan halaman adalah pengguna yang masuk dengan pengalaman yang disesuaikan. Saat Anda melihat halaman beranda Anda, kami perlu mencari semua teman Anda, menanyakan pembaruan mereka yang paling relevan (dari layanan kustom yang kami bangun bernama Multifeed), memfilter hasil berdasarkan pengaturan privasi Anda, kemudian mengisi cerita dengan komentar , foto, suka, dan semua data kaya yang orang suka tentang Facebook. Semua ini hanya dalam waktu satu detik. HipHop memungkinkan kita untuk menulis logika yang melakukan perakitan halaman akhir dalam PHP dan beralih dengan cepat sambil mengandalkan layanan back-end khusus di C ++, Erlang, Java, atau Python untuk melayani Umpan Berita, pencarian, Obrolan, dan bagian inti lainnya dari situs ini.

Sejak 2007 kami telah memikirkan beberapa cara berbeda untuk menyelesaikan masalah ini dan bahkan telah mencoba menerapkan beberapa dari mereka. Saran umum adalah hanya menulis ulang Facebook dalam bahasa lain, tetapi mengingat kompleksitas dan kecepatan pengembangan situs ini, ini akan membutuhkan waktu untuk dicapai. Kami telah menulis ulang aspek-aspek Mesin Zend - internal PHP - dan berkontribusi tambalan-tambalan itu kembali ke proyek PHP, tetapi pada akhirnya belum melihat jenis peningkatan kinerja yang diperlukan. Manfaat HipHop hampir transparan dengan kecepatan pengembangan kami.

Peretasan HipHop

Suatu malam di Hackathon beberapa tahun yang lalu (lihat Prime Time Hack), saya mulai potongan kode pertama saya mengubah PHP menjadi C ++. Bahasa ini secara sintaksis mirip dan C ++ secara drastis mengungguli PHP dalam hal penggunaan CPU dan memori. Bahkan PHP sendiri ditulis dalam C. Kita tahu bahwa mustahil untuk berhasil menulis ulang seluruh basis kode dari ukuran ini dengan tangan, tetapi bertanya-tanya apa yang akan terjadi jika kita membangun sebuah sistem untuk melakukannya secara terprogram.

Menemukan cara baru untuk meningkatkan kinerja PHP bukanlah konsep baru. Saat dijalankan, Mesin Zend mengubah sumber PHP Anda menjadi opcode yang kemudian dijalankan melalui Mesin Virtual Zend. Proyek open source seperti APC dan eAccelerator cache output ini dan digunakan oleh sebagian besar situs web bertenaga PHP. Ada juga Zend Server, produk komersial yang membuat PHP lebih cepat melalui optimasi dan caching opcode. Sebaliknya, kami berpikir tentang mengubah sumber PHP langsung ke C ++ yang kemudian dapat diubah menjadi kode mesin asli. Bahkan mengkompilasi PHP bukanlah ide baru, proyek open source seperti Roadsend dan phc mengkompilasi PHP ke C, Quercus mengkompilasi PHP ke Java, dan Phalanger mengkompilasi PHP ke .Net.

Tak perlu dikatakan, butuh waktu lebih lama dari pada Hackathon itu. Delapan bulan kemudian, saya punya cukup kode untuk menunjukkan bahwa memang mungkin untuk berjalan lebih cepat dengan kode yang dikompilasi. Kami dengan cepat menambahkan Iain Proctor dan Minghui Yang ke tim untuk mempercepat langkah proyek. Kami menghabiskan sepuluh bulan ke depan menyelesaikan semua pengkodean dan enam bulan berikutnya menguji pada server produksi. Kami bangga mengatakan bahwa pada titik ini, kami melayani lebih dari 90% lalu lintas Web kami menggunakan HipHop, semuanya hanya enam bulan setelah penerapan.

Cara Kerja HipHop

Tantangan utama dari proyek ini adalah menjembatani kesenjangan antara PHP dan C ++. PHP adalah bahasa scripting dengan pengetikan yang dinamis dan lemah. C ++ adalah bahasa yang dikompilasi dengan pengetikan statis. Sementara PHP memungkinkan Anda untuk menulis fitur dinamis ajaib, sebagian besar PHP relatif mudah. Lebih mungkin Anda melihat if (...) {...} else {..}daripada melihat function foo($x) { include $x; }. Di sinilah kita mendapatkan kinerja. Bilamana memungkinkan, kode yang kami hasilkan menggunakan pengikatan statis untuk fungsi dan variabel. Kami juga menggunakan inferensi tipe untuk memilih jenis yang paling spesifik untuk variabel kami dan dengan demikian menghemat memori.

Proses transformasi mencakup tiga langkah utama:

  1. Analisis statis tempat kami mengumpulkan informasi tentang siapa yang menyatakan apa dan dependensi,
  2. Ketik inferensi di mana kita memilih tipe paling spesifik antara skalar C ++, String, Array, kelas, Objek, dan Varian, dan
  3. Pembuatan kode yang sebagian besar adalah korespondensi langsung dari pernyataan dan ekspresi PHP ke pernyataan dan ekspresi C ++.

Kami juga telah mengembangkan HPHPi, yang merupakan juru bahasa eksperimental yang dirancang untuk pengembangan. Saat menggunakan HPHPi Anda tidak perlu mengkompilasi kode sumber PHP Anda sebelum menjalankannya. Ini membantu kami menangkap bug di HipHop sendiri dan memberi para insinyur cara untuk menggunakan HipHop tanpa mengubah cara mereka menulis PHP.

Secara keseluruhan HipHop memungkinkan kita untuk menjaga aspek terbaik dari PHP sambil mengambil keuntungan dari manfaat kinerja C ++. Secara total, kami telah menulis lebih dari 300.000 baris kode dan lebih dari 5.000 unit tes.

Trinidad
sumber
4
Ini adalah jawabannya, sedikit warna akan menyenangkan, tetapi pada dasarnya turun ke kinerja. Mereka ingin aplikasi mereka untuk skala yang lebih baik, tetapi mereka juga memiliki lebih banyak orang yang terampil dalam PHP dan merasa PHP membuat mereka lebih produktif. Jadi solusinya memungkinkan kesederhanaan PHP dengan kinerja C. Basis kode mereka terlalu besar untuk menerjemahkannya secara manual.
Cervo
13

Jawaban singkat - tidak, Anda tidak perlu C ++.

Saya yakin Anda mengacu pada HipHop . Jika Anda membaca tentang peningkatan yang diberikannya, itu sekitar 50%. Ini sangat penting jika Anda Facebook yang memiliki ribuan server frontend. Memotong beban berarti jutaan penghematan biaya pusat data. Dalam kasus perusahaan yang memiliki 10-100 server frontend, biaya pengembangan akan jauh melebihi penghematan yang mungkin. Bagaimanapun, pemrosesan yang paling berat dilakukan di back-end, yang biasanya merupakan solusi RDBMS atau NoSQL, dikembangkan sebagai kode C / C ++ yang sangat dioptimalkan.

Tentu saja bisa mencapai penghematan yang jauh lebih tinggi hanya dengan membuang PHP sepenuhnya. Tapi itu bukan sesuatu yang bisa Anda lakukan dengan basis kode besar, seperti halnya Facebook.

Sekarang, untuk bagian lain dari pertanyaan: jika Anda benar-benar ingin tahu bagaimana menangani banyak sekali, baca blog Skalabilitas Tinggi , khususnya bagian Arsitektur Kehidupan Nyata.

Itu mungkin dengan PHP, tapi jelas bukan pilihan saya. Jika Anda ingin bahasa yang dinamis, Python, Ruby atau mungkin Lua akan menjadi pilihan yang jauh lebih baik.

vartec
sumber
2
+1, tetapi skalabilitas praktis tidak ada hubungannya dengan bahasa yang digunakan. Arsitektur basis data memiliki pengaruh yang jauh lebih besar.
dan_waterworth
1
@ Dan: itu sebabnya saya katakan - itu mungkin dengan PHP.
vartec
2
Menurut entri blog yang dikutip @Trinidad, 50% adalah peningkatan rata - rata , bukan maksimum.
Jerry Coffin
2
@ Jerry: benar, tapi masih sangat, sangat jauh dari perbedaan kinerja aktual antara C ++ dan PHP.
vartec
6

Yang menyenangkan tentang pendekatan FB adalah bahwa mereka tidak harus segera memutuskan. Anda harus melakukan hal yang sama. Pilih bahasa yang membuat Anda paling produktif, tetapi pastikan antarmuka itu mudah digunakan dengan C / C ++.

Setelah Anda memiliki jutaan pengguna dan perlu mencukur milidetik dari waktu respons, Anda dapat mengoptimalkan jalur kritis menggunakan C / C ++.

Hanya sedikit Roger
sumber
0

Elemen C ++ yang digunakan oleh Facebook adalah HHVM.

Itu adalah mesin virtual HIPHOP. Meskipun ditulis dalam C ++ pada dasarnya ini adalah "penerjemah PHP yang lebih baik".

Kode php dikompilasi menjadi kode byte yang kemudian ditafsirkan oleh HHVM pada waktu eksekusi dan tunduk pada optimasi "Just In Time" saat dijalankan.

Para pengembang di face book masih menulis sebagian besar dalam PHP, dan, apa yang Anda lihat di browser Anda hampir pasti dihasilkan oleh program PHP - semua yang telah dikompilasi dan ditafsirkan oleh runtime HHVM.

HHVM sebenarnya adalah open source yang tersedia secara bebas. Jadi, jika Anda perlu menyajikan satu juta gambar kucing lucu per jam, maka Anda dapat mengunduh HHVM dan mempercepat server Anda dengan perubahan minimal ke PHP Anda.

James Anderson
sumber