3 điểm bởi GN⁺ 2024-03-18 | 1 bình luận | Chia sẻ qua WhatsApp

Trang của Brendan: Bắt đầu

  • Trang chủ blog của Brendan Gregg đề cập đến nhiều chủ đề đa dạng về hiệu năng hệ thống, công cụ BPF, hiệu năng Linux và hơn thế nữa.
  • Các bài viết gần đây bao gồm sự trở lại của frame pointer, phim tài liệu về eBPF, và việc các công cụ quan sát eBPF không phải là công cụ bảo mật.
  • Blog cũng chia sẻ nội dung kỹ thuật cùng với nhiều hội nghị và bài thuyết trình mà Brendan đã tham gia.

Sự trở lại của frame pointer

  • Trên các hệ thống không có frame pointer, stack trace dừng lại ở lớp libc, khiến các frame của ứng dụng bị thiếu.
  • Fedora và Ubuntu đã giải quyết vấn đề này bằng cách phát hành các phiên bản biên dịch libc có bao gồm frame pointer theo mặc định.
  • Frame pointer được các profiler và debugger bên ngoài sử dụng, và được trực quan hóa bằng flame graph.

Frame pointer là gì?

  • Theo tài liệu ABI x86-64, thanh ghi CPU %rbp có thể được dùng làm "base pointer" của stack frame.
  • Kỹ thuật này được dùng rộng rãi để stack trace, và được Linux perf, eBPF cùng nhiều công cụ khác sử dụng.

Năm 2004: Loại bỏ frame pointer

  • Năm 2004, nhà phát triển gcc Roger Sayle đã thực hiện thay đổi nhằm ngừng tạo frame pointer.
  • Thay đổi này mang lại cải thiện hiệu năng, nhưng với sự xuất hiện của eBPF, ngày nay một số debugger/profiler gặp vấn đề vì điều đó.

2005-2023: Mùa đông của các profiler bị hỏng

  • Thay đổi loại bỏ frame pointer cũng được áp dụng cho x86-64, nhưng kiến trúc này có nhiều thanh ghi hơn nên lợi ích thu được không lớn.
  • Vì vậy, nhiều debugger/profiler đã không còn hoạt động đúng cách.

Năm 2014: Java in Flames

  • Khi gia nhập Netflix, Brendan phát hiện việc Java thiếu hỗ trợ frame pointer đã làm hỏng toàn bộ stack của ứng dụng.
  • Để giải quyết vấn đề này, ông đã phát triển một bản sửa cho trình biên dịch JVM c2.

2015-2020: Overhead

  • Overhead hiệu năng khi thêm frame pointer vào mọi thứ nhìn chung thường dưới 1%.
  • Trong một số microbenchmark cụ thể, overhead có thể lên tới 10%.

Năm 2022: Nỗ lực upstream

  • Điều này cho thấy các công ty lớn như Google, Meta, Netflix và những bên khác đã bật frame pointer cho mọi thứ từ trước.
  • Tuy nhiên, có nhiều khó khăn trong việc biến thay đổi này thành mặc định để mọi người cùng hưởng lợi.

Năm 2023, 2024: Frame pointer trên Fedora và Ubuntu

  • Fedora đã chấp nhận đề xuất bật lại frame pointer.
  • Ubuntu cũng bật frame pointer theo mặc định trong phiên bản 24.04 LTS.

Sau năm 2034: Vượt ra ngoài frame pointer

  • Có nhiều cách để truy vết stack, như LBR, BTS, AET, DWARF, eBPF stack walking, ORC, SFrames và shadow stack.
  • Trong tương lai, SFrames hoặc shadow stack có thể được dùng cho mọi stack trace.

Kết luận

  • Sự trở lại của frame pointer giúp CPU flame graph trở nên ý nghĩa hơn, khiến Off-CPU flame graph lần đầu tiên hoạt động được, và mở ra những khả năng mới khác.
  • Đây cũng là một chiến thắng cho các continuous profiler, vì họ không còn cần thuyết phục khách hàng thay đổi OS để profiler có thể hoạt động đầy đủ.

Ý kiến của GN⁺

  • Sự trở lại của frame pointer có vẻ sẽ là trợ giúp lớn cho phân tích hiệu năng hệ thống và gỡ lỗi. Đặc biệt, đây là công cụ thiết yếu để chẩn đoán sự cố và tối ưu hiệu năng trong các hệ thống phần mềm phức tạp.
  • Thay đổi này cho thấy tầm quan trọng của sự hợp tác và đóng góp từ cộng đồng mã nguồn mở. Quyết định của Fedora và Ubuntu có thể ảnh hưởng đến các bản phân phối khác, từ đó mang lại thay đổi tích cực cho toàn bộ hệ sinh thái Linux.
  • Việc đưa frame pointer trở lại là bài toán cân bằng giữa suy giảm hiệu năng và sự dễ dàng trong gỡ lỗi. Quyết định như vậy có thể được hiểu rõ hơn thông qua kiểm thử và phân tích hiệu năng trong môi trường vận hành thực tế.
  • Với những người dùng có nền tảng kỹ thuật, thay đổi này có thể rất thú vị, đồng thời cung cấp thông tin hữu ích cho các nhà phát triển hoặc quản trị viên hệ thống quan tâm đến việc cải thiện hiệu năng hệ thống.
  • Nếu có các công nghệ hoặc công cụ khác cung cấp chức năng tương tự frame pointer, ví dụ như các profiler dựa trên phần cứng như Intel VTune Profiler hoặc AMD uProf, thì chúng cũng có thể cho phép phân tích hiệu năng ngay cả khi không có frame pointer.

1 bình luận

 
GN⁺ 2024-03-18
Ý kiến trên Hacker News
  • Trải nghiệm khi việc lược bỏ stack frame pointer bắt đầu lan rộng vào đầu những năm 2000
    • Tác giả khi đó đang học khoa học máy tính, còn chiếc máy tính đang dùng thì cũ và hiệu năng thấp.
    • Khi việc debug trở nên khó khăn hơn, tác giả bắt đầu dùng Python để tránh các vấn đề debug.
  • Nỗ lực duy trì stack frame pointer trong bản phân phối Fedora
    • Từng có niềm tin sai lầm rằng stack frame pointer gây ra overhead lớn, nhưng trên thực tế overhead dưới 1%.
  • Việc Apple luôn giữ stack trace có ý nghĩa trên kiến trúc ARM
    • Một số hàm cụ thể có thể không tạo frame record, nhưng stack trace vẫn hữu ích ngay cả khi không có thông tin debug.
  • Trải nghiệm tại Google và cuộc tranh luận kéo dài 20 năm với cộng đồng
    • Chia sẻ kinh nghiệm vá và bảo trì để áp dụng libunwind cho gperftools.
  • Trường hợp từng thấy hiệu năng được cải thiện nhờ tùy chọn -fomit-frame-pointer
    • Biên dịch MySQL và PHP trên bộ xử lý 32-bit để giảm chi phí phần cứng.
  • Cách ngôn ngữ lập trình Virgil quản lý stack frame
    • Nếu không có cấp phát stack động, có thể tìm kích thước frame bằng một phép tra bảng đơn giản.
    • Giải thích về đoạn mã triển khai việc giải mã metadata.
  • Ý tưởng quản lý hai stack bằng RBP và RSP thay vì “đi bộ” qua stack
    • Call stack trở thành một mảng địa chỉ trả về đơn thuần, từ đó giảm nhu cầu stack walking.
  • Chia sẻ kinh nghiệm và suy nghĩ liên quan đến việc ủng hộ frame pointer
    • Việc bật frame pointer hay không nên được quyết định theo từng trường hợp, và benchmark là rất quan trọng.
    • Tầm quan trọng của việc hệ thống build cung cấp khả năng thay đổi điều này trên phạm vi toàn cục.
    • Kỳ vọng vào SFrame và tiềm năng giải quyết các vấn đề hiện tại của nó.
  • Ý kiến cho rằng profiling đã là vấn đề suốt 20 năm và giờ mới được giải quyết
    • Việc thiếu frame pointer đã gây khổ sở cho nhiều người, và giờ khi Linux đang đưa nó trở lại, họ cảm thấy như những nỗ lực đó cuối cùng cũng được công nhận.
  • Sự bất mãn về hiệu năng của cơ chế cho phép system profiling là điều đầy nghịch lý
    • Phàn nàn về hiệu năng của chính hệ thống giúp xác định vấn đề hiệu năng là đỉnh cao của tối ưu hóa quá sớm.