PHP HHVM là gì?

HHVM là một máy ảo cho PHP và Hack [một phần mở rộng của PHP] được sử dụng để cung cấp năng lượng cho trang web của Facebook trong số những trang khác. Lựa chọn bài báo hôm nay mô tả việc triển khai HHVM thế hệ thứ hai, mang lại 21. Tăng 7% hiệu suất khi chạy trang web Facebook so với triển khai HHVM trước đó

…cơ sở mã PHP chạy trang web Facebook bao gồm hàng chục triệu dòng mã nguồn, được dịch sang hàng trăm MB mã máy trong quá trình thực thi

Rõ ràng là tôi đang hiểu quá đơn giản về những gì ứng dụng web Facebook thực sự làm, nhưng đồng thời nếu tôi yêu cầu bạn viết một bản sao Facebook chỉ cho trang web [không phải dịch vụ hỗ trợ, không phải ứng dụng dành cho thiết bị di động, v.v. ], ước tính ban đầu của bạn có phải là hàng chục triệu dòng mã không ???

Tổng quan cấp cao HHVM

Điểm khởi đầu cho HHVM là mã nguồn bằng PHP hoặc Hack. Hack là một phương ngữ PHP được Facebook sử dụng và bao gồm hỗ trợ cho một bộ gợi ý kiểu phong phú hơn. Từ quan điểm của HHVM mặc dù hai ngôn ngữ về cơ bản là tương đương. Đặc biệt, gợi ý kiểu của Hack chỉ được sử dụng bởi trình kiểm tra kiểu tĩnh và bị thời gian chạy HHVM loại bỏ

Lý do loại bỏ các gợi ý loại phong phú hơn này trong thời gian chạy là hệ thống loại dần dần của Hack không hợp lý. Trình kiểm tra kiểu tĩnh là lạc quan và nó bỏ qua nhiều tính năng động của ngôn ngữ. Do đó, ngay cả khi một loại chương trình kiểm tra, các loại khác nhau có thể được quan sát trong thời gian chạy…

Mã nguồn được phân tích cú pháp bởi trình biên dịch HipHop [hphpc] để tạo ra một cây cú pháp trừu tượng [AST]. HHVM v2 bổ sung trình biên dịch HipHop Bytecode-to-Bytecode mới [hhbbc] dịch AST thành HHBC, mã byte của HHVM. Một số phân tích và tối ưu hóa được thực hiện trong quá trình dịch sang HHBC, tất cả đều được thực hiện 'trước thời hạn', i. e. , trước khi chương trình thực sự thực thi

HHBC là mã byte dựa trên ngăn xếp, nghĩa là phần lớn các lệnh mã byte tiêu thụ đầu vào từ hoặc đẩy kết quả vào ngăn xếp đánh giá hoặc cả hai

Khi chạy, HHVM kết hợp trình thông dịch luồng truyền thống và trình biên dịch JIT. Một tính năng quan trọng của thiết kế JIT là việc sử dụng các lối thoát phụ sử dụng thay thế trên ngăn xếp [OSR] để việc thực thi mã được biên dịch luôn có thể dừng tại bất kỳ điểm chương trình [mức mã byte] nào và chuyển quyền điều khiển trở lại trình thông dịch, bộ thực thi.

Khả năng luôn dự phòng cho trình thông dịch này có nghĩa là JIT có thể tự do tập trung vào các trường hợp sử dụng chính và tránh tất cả các trường hợp góc kỳ lạ có thể xảy ra trong một ngôn ngữ động [e. g. , nhân một chuỗi với một mảng. ]. Đối với các ứng dụng quy mô lớn, nó cũng giúp quản lý chi phí hoạt động của CPU và bộ nhớ phát sinh do quá trình biên dịch JIT vì không phải mọi thứ đều cần được biên dịch theo JIT

Cốt lõi của bài viết mô tả thiết kế và triển khai HHVM JIT mới

HHVM JIT mới

HHVM JIT được thiết kế xung quanh bốn nguyên tắc chính

  1. Loại chuyên môn hóa
  2. Tối ưu hóa theo hướng dẫn hồ sơ
  3. lối thoát bên
  4. biên soạn dựa trên khu vực

Mặc dù mỗi nguyên tắc này đã được sử dụng bởi một số hệ thống trước đó, nhưng sự kết hợp của bốn nguyên tắc này trong trình biên dịch JIT ngôn ngữ động là mới lạ theo hiểu biết tốt nhất của chúng tôi

Chuyên môn hóa loại sử dụng thông tin loại—có thể thu được tĩnh hoặc động—để tạo mã cụ thể cho loại. Ví dụ: mã dành riêng cho số nguyên [không được tính tham chiếu] có thể hiệu quả hơn. Có một sự đánh đổi được thực hiện ở đây giữa việc tăng hiệu suất của mã chuyên biệt và chi phí chung để tạo ra nhiều thói quen theo loại cụ thể [chuyên môn hóa quá mức]

Một trong những nguồn chính của thông tin kiểu động mà HHVM JIT sử dụng là lược tả

Tối ưu hóa theo hướng dẫn hồ sơ [PGO], còn được gọi là tối ưu hóa dựa trên chi phí [FDO], là một loại tối ưu hóa có thể được kích hoạt hoặc nâng cao bằng cách sử dụng thông tin thời gian chạy

Ngoài thông báo chuyên môn hóa loại, thông tin hồ sơ cũng được sử dụng để bố trí mã và gửi phương thức

Lối thoát phụ [hay còn gọi là bẫy không phổ biến] cho phép JIT chuyên môn hóa mã cho các loại phổ biến mà không hỗ trợ các loại không phổ biến thậm chí có thể không thực hiện được trong thời gian chạy

Việc tạo mã trong HHVM dựa trên các vùng [biên dịch dựa trên vùng], trong đó các vùng không bị hạn chế đối với toàn bộ phương thức, khối cơ bản đơn lẻ hoặc dấu vết đường thẳng. Quá trình biên dịch dựa trên khu vực hoạt động tốt với chuyên môn hóa loại, tối ưu hóa hướng dẫn hồ sơ và thoát bên. hồ sơ làm nổi bật các khu vực sau đó được sử dụng để biên dịch mã được tạo cho các loại phổ biến, với các lối thoát bên để quay trở lại thực thi được diễn giải trong các trường hợp ít phổ biến hơn

Cấu trúc dữ liệu được sử dụng để biểu diễn các vùng ở mức mã byte là một bộ mô tả vùng. Bộ mô tả vùng chứa biểu đồ luồng điều khiển [CFG], trong đó mỗi nút là vùng khối cơ bản được sử dụng để định hình. Đối với mỗi khối, một bộ mô tả vùng chứa

  • trình tự các hướng dẫn mã byte
  • điều kiện tiên quyết [loại bảo vệ]
  • hậu điều kiện [các loại đã biết ở cuối bản dịch]
  • các ràng buộc về loại [mã hóa thông tin về lượng kiến ​​thức cần thiết cho từng loại đầu vào để tạo mã hiệu quả]

Các bộ mô tả vùng được hạ xuống thành Biểu diễn trung gian HipHop [HHIR], một biểu diễn được nhập bằng cách sử dụng biểu mẫu gán đơn tĩnh [SSA]. Thông tin loại đến từ trình biên dịch hhbbc và từ dữ liệu định hình. Cấp độ HHIR là nơi diễn ra hầu hết các tối ưu hóa mã

Ở cấp độ bên dưới HHIR là đại diện của Hội đồng ảo [Vasm]. Bộ hướng dẫn của nó rất gần với mã máy, nhưng hỗ trợ vô số thanh ghi ảo

Có ba chế độ biên dịch khác nhau trong HHVM JIT. bản dịch trực tiếp [loại duy nhất được hỗ trợ trong triển khai thế hệ đầu tiên], bản dịch định hình [tối ưu hóa cơ bản cộng với việc chèn cấu hình khối] và bản dịch được tối ưu hóa hoàn toàn

Tối ưu hóa quan trọng

Quy trình tối ưu hóa đầy đủ áp dụng các tối ưu hóa ở từng cấp độ trừu tượng, như được tóm tắt trong hình bên dưới

Trước khi tối ưu hóa dựa trên khu vực, cũng có một số tối ưu hóa toàn bộ chương trình quan trọng

Toàn chương trình

  • Chức năng sắp xếp đặt các chức năng thường gọi nhau gần nhau trong bộ nhớ. Biểu đồ cuộc gọi trực tiếp có trọng số được xây dựng cho chương trình, sử dụng bộ đếm cấu hình khối cơ bản để thông báo trọng số. Sau đó, các chức năng được phân cụm và sắp xếp. Thuật toán đủ nhanh để xử lý số lượng lớn mã được tạo để hỗ trợ trang web Facebook trong chưa đầy một giây
  • trang lớn. khi mã nóng được nhóm trong bộ đệm mã, mã này sau đó được ánh xạ lên các trang lớn

cấp khu vực

  • Đối với các bản dịch trực tiếp và định hình, các vùng được hình thành bằng cách kiểm tra trạng thái VM và các loại trực tiếp đang chạy. Đối với các bản dịch được tối ưu hóa, thông tin hồ sơ đã thu thập được sử dụng. Một chức năng đơn lẻ có thể được chia thành nhiều vùng và ngược lại, một vùng có thể chứa các phần của nhiều chức năng [thông qua nội tuyến một phần]. Mỗi chức năng được liên kết với một CFG có trọng số cho tất cả các khối bên trong nó, được nhóm thành các vùng bằng cách sử dụng tìm kiếm theo chiều sâu với các khối và cung được bỏ qua tùy chọn dựa trên trọng số của chúng
  • Thư giãn bảo vệ giúp tránh chuyên môn hóa quá mức, trong đó trình biên dịch chuyên môn hóa mã quá mức, dẫn đến phình to mã. Như tên cho thấy, nới lỏng bảo vệ làm suy yếu các điều kiện tiên quyết của bảo vệ loại trong một số trường hợp để cho phép nhiều loại đi qua. Tất nhiên, mã được tạo tương ứng sẽ kém hiệu quả hơn một chút vì giờ đây nó phải đối phó với nhiều loại hơn – nhưng nó vẫn có thể tốt hơn nhiều so với mã chung hoàn toàn. Ví dụ, bộ phận bảo vệ chỉ dành cho số nguyên có thể được nới lỏng để cho phép số nguyên và nhân đôi

cấp độ HHIR

  • Nội tuyến một phần được sử dụng để nội tuyến các phương thức đơn giản phổ biến như getters và setters [nó là một phần vì nội tuyến đầy đủ có thể dẫn đến phình to mã]
  • PHP sử dụng tính toán tham chiếu để quản lý bộ nhớ cho các loại phổ biến như chuỗi, đối tượng và mảng. Các giải pháp đếm tham chiếu ngây thơ có thể dẫn đến chi phí đáng kể. HHVM JIT sử dụng loại bỏ đếm tham chiếu để tránh đếm tham chiếu nếu có thể. Bản chất của ý tưởng là chìm các hướng dẫn gia tăng trong biểu đồ cuộc gọi nơi có thể chứng minh được an toàn. Nếu một hướng dẫn tăng chìm sao cho nó hiện nằm cạnh hướng dẫn giảm dần, thì cặp đó có thể bị loại bỏ
  • Việc gửi phương thức được tối ưu hóa bằng cách sử dụng thông tin từ trình lược tả. HHIR chuyên dụng được phát ra để [a] ảo hóa các lệnh gọi đơn hình, [b] tối ưu hóa các lệnh gọi từ một lớp cơ sở chung và [c] tối ưu hóa các lệnh gọi trong đó các phương thức triển khai cùng một giao diện

cấp độ ống dẫn tinh

  • Phân bổ đăng ký được triển khai bằng thuật toán phân bổ đăng ký quét tuyến tính Wimmer và Franz
  • Bố cục mã được tối ưu hóa [bố cục khối và tách nóng/lạnh]. “Các thuật toán được sử dụng cho các mục đích này là các kỹ thuật truyền thống do Pettis và Hansen đề xuất. “

Sự đánh giá

Việc đánh giá dựa trên các phép đo được lấy từ trang web Facebook chạy trên HHVM. Các kết quả dòng trên cùng có thể được nhìn thấy trong hình dưới đây, cần một chút diễn giải

Thanh 'vùng JIT' hiển thị hiệu suất của đường dẫn tối ưu hóa đầy đủ, được chuẩn hóa thành 100%. Thế hệ trước của HHVM JIT chỉ hỗ trợ dịch trực tiếp và hiệu suất của nó được thể hiện bằng thanh 'JIT-Tracelet'. Con đường dịch thuật trực tiếp đạt được 82. 2% hiệu suất tối ưu hóa đầy đủ, hay nói cách khác, vùng JIT trong HHVM v2 cung cấp khoảng 21. tăng tốc 7%. Hiệu suất đạt được bằng cách dịch cấu hình chỉ được hiển thị trong thanh 'JIT-profile' [khoảng 39. 8% hiệu suất tối ưu hóa đầy đủ]. Ngay cả bản dịch hồ sơ cũng tự tạo mã 3. Nhanh hơn gấp 1 lần so với mã được giải thích

Có thể thấy sự đóng góp của các tối ưu hóa khác nhau trong biểu đồ sau, biểu đồ này khám phá sự chậm lại tương đối với việc vô hiệu hóa có chọn lọc các tối ưu hóa riêng lẻ

HHVM dùng để làm gì?

HHVM là một máy ảo mã nguồn mở được thiết kế để thực thi các chương trình được viết bằng Hack . HHVM sử dụng phương pháp biên dịch đúng lúc [JIT] để đạt được hiệu suất thời gian chạy tuyệt vời trong khi vẫn duy trì tính linh hoạt phát triển tuyệt vời. HHVM hỗ trợ ngôn ngữ lập trình Hack.

HHVM có thể chạy PHP không?

hhvm[1] [hay còn gọi là Máy ảo HipHop] là một máy ảo nguồn mở được thiết kế để thực thi các chương trình viết bằng Hack và PHP .

Mô-đun HHVM là gì?

Máy ảo HipHop [HHVM] là một máy ảo nguồn mở dựa trên quá trình biên dịch just-in-time [JIT] đóng vai trò là công cụ thực thi cho ngôn ngữ lập trình Hack< . .

Facebook có sử dụng HHVM không?

Jump-Start đã được triển khai thành công trong Máy ảo HipHop [HHVM], không chỉ hỗ trợ Facebook. com mà còn nhiều trang web khác trên web .

Chủ Đề