Nỗ lực sớm để loại bỏ Python GIL dẫn đến hiệu suất kém: Tại sao?


13

Bài đăng này từ người tạo Python, Guido Van Rossum, đề cập đến một nỗ lực sớm để loại bỏ GIL khỏi Python:

Điều này đã được thử trước đây, với kết quả đáng thất vọng, đó là lý do tại sao tôi miễn cưỡng tự mình nỗ lực nhiều. Năm 1999, Greg Stein (với Mark Hammond?) Đã tạo ra một nhánh Python (1,5 tôi tin) đã loại bỏ GIL, thay thế nó bằng các khóa hạt mịn trên tất cả các cấu trúc dữ liệu có thể thay đổi. Ông cũng đã gửi các bản vá loại bỏ nhiều sự phụ thuộc vào các cấu trúc dữ liệu có thể thay đổi toàn cầu mà tôi đã chấp nhận. Tuy nhiên, sau khi đo điểm chuẩn, nó đã chỉ ra rằng ngay cả trên nền tảng có khóa nguyên thủy khóa nhanh nhất (Windows vào thời điểm đó), nó đã làm chậm quá trình thực thi đơn luồng gần gấp hai lần, nghĩa là trên hai CPU, bạn có thể làm việc nhiều hơn một chút được thực hiện mà không có GIL so với trên một CPU với GIL. Điều này là không đủ, và bản vá của Greg biến mất vào quên lãng. (Xem bài viết của Greg về hiệu suất.)

Tôi khó có thể tranh luận với kết quả thực tế, nhưng tôi thực sự tự hỏi tại sao điều này xảy ra. Có lẽ, lý do chính khiến việc loại bỏ GIL khỏi CPython là rất khó là do hệ thống quản lý bộ nhớ đếm tham chiếu. Một chương trình Python thông thường sẽ gọi Py_INCREFPy_DECREFhàng ngàn hoặc hàng triệu lần, làm cho nó trở thành một điểm tranh chấp quan trọng nếu chúng ta quấn các khóa xung quanh nó.

Nhưng, tôi không hiểu tại sao việc thêm các nguyên thủy nguyên tử sẽ làm chậm một chương trình luồng đơn . Giả sử chúng ta vừa sửa đổi CPython để biến refcount trong mỗi đối tượng Python là nguyên thủy nguyên tử. Và sau đó chúng ta chỉ thực hiện một bước tăng nguyên tử (hướng dẫn tìm nạp và thêm) khi chúng ta cần tăng số tham chiếu. Điều này sẽ làm cho tham chiếu Python đếm luồng an toàn và không nên có bất kỳ hình phạt hiệu năng nào trên ứng dụng một luồng, bởi vì sẽ không có tranh chấp khóa.

Nhưng than ôi, nhiều người thông minh hơn tôi đã cố gắng và thất bại, vì vậy rõ ràng tôi đang thiếu một cái gì đó ở đây. Có gì sai với cách tôi nhìn vấn đề này?


1
Lưu ý rằng hoạt động giới thiệu sẽ không phải là nơi duy nhất cần đồng bộ hóa. Trích dẫn đề cập đến "các khóa hạt mịn trên tất cả các cấu trúc dữ liệu có thể thay đổi" mà tôi đoán bao gồm ít nhất một mutex cho mọi danh sách và đối tượng từ điển. Ngoài ra, tôi không nghĩ các hoạt động số nguyên tử có hiệu quả tương đương với phi nguyên tử bất kể sự tranh chấp, bạn có nguồn nào cho việc đó không?

đơn giản, bởi vì các hoạt động nguyên tử chậm hơn so với các nguyên tử tương đương. Chỉ vì đó là một hướng dẫn duy nhất không có nghĩa là nó tầm thường dưới mui xe. Xem phần này để thảo luận
Móż

Câu trả lời:


9

Tôi không quen thuộc với ngã ba Greg Stein Python, vì vậy hãy giảm giá so sánh này dưới dạng tương tự lịch sử đầu cơ nếu bạn muốn. Nhưng đây chính xác là kinh nghiệm lịch sử của nhiều cơ sở hạ tầng chuyển từ triển khai đơn sang đa luồng.

Về cơ bản mọi triển khai Unix tôi đã nghiên cứu trong những năm 1990 - AIX, DEC OSF / 1, DG / UX, DYNIX, HP-UX, IRIX, Solaris, SVR4 và SVR4 MP - tất cả đều trải qua chính xác loại "chúng tôi đã đưa vào khóa hạt mịn hơn - bây giờ chậm hơn !! " vấn đề. Các DBMS tôi đã theo dõi - DB2, Ingres, Informix, Oracle và Sybase - tất cả chúng cũng đã trải qua điều đó.

Tôi đã nghe nói "những thay đổi này sẽ không làm chúng tôi chậm lại khi chúng tôi chạy một luồng" một triệu lần. Nó không bao giờ hoạt động theo cách đó. Hành động đơn giản của việc kiểm tra có điều kiện "chúng ta có đang chạy đa luồng hay không?" thêm chi phí thực tế, đặc biệt là trên các CPU có đường ống cao. Các hoạt động nguyên tử và khóa xoay thỉnh thoảng được thêm vào để đảm bảo tính toàn vẹn của cấu trúc dữ liệu được chia sẻ phải được gọi khá thường xuyên và chúng rất chậm. Nguyên thủy khóa / đồng bộ hóa thế hệ đầu tiên cũng chậm. Hầu hết các nhóm thực hiện cuối cùng đã thêm một số lớp nguyên thủy, trong các "điểm mạnh" khác nhau, tùy thuộc vào mức độ bảo vệ khóa liên động là cần thiết ở nhiều nơi khác nhau. Sau đó, họ nhận ra nơi ban đầu họ tát xuống các khóa nguyên thủy không thực sự đúng chỗ, vì vậy họ phải lập hồ sơ, thiết kế xung quanh các nút thắt được tìm thấy, và hệ thống roto-Until. Một số trong những điểm gắn bó này cuối cùng đã tăng tốc hệ điều hành hoặc phần cứng, nhưng toàn bộ quá trình tiến hóa mất 3-5 năm, mức tối thiểu. Trong khi đó, các phiên bản MP hoặc MT đều khập khiễng, hiệu năng.

Mặt khác, các nhóm phát triển tinh vi đã lập luận rằng những sự chậm chạp như vậy về cơ bản là một thực tế khó khăn, dai dẳng của cuộc sống. IBM ví dụ đã từ chối SMP kích hoạt AIX trong ít nhất 5 năm sau cuộc thi, tuyên bố rằng một luồng chỉ hoàn toàn tốt hơn. Sybase đã sử dụng một số đối số tương tự. Lý do duy nhất một số nhóm cuối cùng xuất hiện là hiệu năng đơn luồng không còn có thể được cải thiện một cách hợp lý ở cấp độ CPU. Họ bị buộc phải đi MP / MT hoặc chấp nhận có một sản phẩm ngày càng không cạnh tranh.

Hoạt động đồng thời là CỨNG. Và đó là lừa dối. Mọi người đổ xô vào nó với suy nghĩ "điều này sẽ không tệ lắm." Sau đó, họ nhấn vào cát lún, và phải đi qua. Tôi đã thấy điều này xảy ra với ít nhất một tá đội thông minh, được tài trợ tốt, được tài trợ tốt. Nói chung, có vẻ như phải mất ít nhất năm năm sau khi chọn đa luồng để "quay lại nơi cần đến, thông minh về hiệu suất" với các sản phẩm MP / MT; hầu hết vẫn có ý nghĩa cải thiện hiệu quả / khả năng mở rộng MP / MT thậm chí mười năm sau khi thực hiện thay đổi.

Vì vậy, suy đoán của tôi là, sự vắng mặt của sự chứng thực và hỗ trợ của GvR, không ai nhận được sự ủng hộ lâu dài đối với Python và GIL của nó. Ngay cả khi họ đã làm như vậy ngày hôm nay, đó sẽ là khung thời gian Python 4.x trước khi bạn nói "Wow! Chúng tôi thực sự vượt qua bướu MT!"

Có lẽ có một số phép thuật tách Python và thời gian chạy của nó khỏi tất cả các phần mềm cơ sở hạ tầng trạng thái khác - tất cả thời gian chạy ngôn ngữ, hệ điều hành, trình giám sát giao dịch và trình quản lý cơ sở dữ liệu đã đi trước đó. Nhưng nếu vậy, nó là duy nhất hoặc gần như vậy. Mọi người khác loại bỏ một tương đương GIL đã mất hơn năm năm nỗ lực, cam kết và đầu tư để có được từ MT-không đến MT-hot.


2
+1 Phải mất khoảng thời gian đó để Tcl đa luồng với một nhóm các nhà phát triển khá nhỏ. Mã này đã an toàn MT trước đó, nhưng có vấn đề về hiệu năng khó chịu, chủ yếu là trong quản lý bộ nhớ (mà tôi nghi ngờ là một khu vực rất nóng đối với các ngôn ngữ động). Trải nghiệm này không thực sự mang đến Python trong bất kỳ điều gì khác ngoài những điều khoản chung nhất; hai ngôn ngữ có mô hình luồng hoàn toàn khác nhau. Chỉ cần mong đợi một khẩu hiệu và mong đợi những con bọ kỳ lạ
Vượt lên

-1

Một giả thuyết hoang dã khác: Năm 1999, Linux và các Unice khác không có sự đồng bộ hóa hiệu suất như bây giờ với futex(2)( http://en.wikipedia.org/wiki/Futex ). Những người đến vào khoảng năm 2002 (và được sáp nhập vào 2,6 vào khoảng năm 2004).

Vì tất cả các cấu trúc dữ liệu dựng sẵn phải được đồng bộ hóa chi phí rất nhiều. Đã chỉ ra rằng các hoạt động nguyên tử không cần thiết rẻ.


1
Bạn có bất cứ điều gì để sao lưu này? hay đây là gần như suy đoán?

1
Báo giá GvR mô tả hiệu suất "trên nền tảng với tính nguyên thủy khóa nhanh nhất (Windows tại thời điểm đó)" vì vậy các khóa chậm trên Linux không liên quan.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.