Hmm, tôi không hoàn toàn bị thuyết phục bởi những lập luận ủng hộ kẻ giết người quá mức và OOM ... Khi womble viết,
"Kẻ giết người OOM chỉ tàn phá nếu bạn làm quá tải hệ thống của mình. Hãy trao đổi đủ và không chạy các ứng dụng đột nhiên quyết định ăn một lượng lớn RAM và bạn sẽ không gặp vấn đề gì."
Anh ta mô tả một kịch bản môi trường trong đó kẻ giết người quá mức và kẻ giết người OOM không được thi hành hoặc không thực sự hành động (nếu tất cả các ứng dụng được cấp phát bộ nhớ khi cần và có đủ bộ nhớ ảo được phân bổ, bộ nhớ ghi sẽ theo sát việc cấp phát bộ nhớ lỗi, vì vậy chúng tôi thực sự không thể nói về một hệ thống quá mức ngay cả khi chiến lược overcommit được kích hoạt). Đó là về một sự thừa nhận ngầm rằng kẻ giết người quá mức và OOM hoạt động tốt nhất khi không cần sự can thiệp của họ, điều này được chia sẻ bởi hầu hết những người ủng hộ chiến lược này, theo như tôi có thể nói (và tôi thừa nhận tôi không thể nói nhiều ...). Morover, đề cập đến các ứng dụng có hành vi cụ thể khi sắp xếp bộ nhớ khiến tôi nghĩ rằng một cách xử lý cụ thể có thể được điều chỉnh ở mức phân phối, thay vì có mặc định,
Đối với vấn đề liên quan đến JVM, đó là một máy ảo, ở một mức độ nào đó, nó cần phân bổ tất cả các tài nguyên cần thiết khi khởi động, để nó có thể tạo môi trường 'giả' cho các ứng dụng của nó và tách biệt tài nguyên có sẵn của nó khỏi máy chủ môi trường, càng xa càng tốt. Do đó, có thể tốt hơn là nó đã thất bại khi khởi động, thay vì sau một thời gian do hậu quả của tình trạng OOM 'bên ngoài' (gây ra bởi kẻ giết người quá mức / OOM / bất cứ điều gì), hoặc dù sao cũng phải chịu đựng một tình trạng như vậy can thiệp vào chính nó Các chiến lược xử lý OOM nội bộ (nói chung, VM sẽ nhận được bất kỳ tài nguyên cần thiết nào ngay từ đầu và hệ thống máy chủ nên 'bỏ qua' chúng cho đến khi kết thúc, giống như bất kỳ lượng ram vật lý nào được chia sẻ với card đồ họa là không bao giờ - và không thể - xúc động bởi HĐH).
Về Apache, tôi nghi ngờ rằng việc thỉnh thoảng toàn bộ máy chủ bị giết và khởi động lại tốt hơn là để một đứa trẻ, cùng với một kết nối, thất bại từ khi bắt đầu (= đứa trẻ / kết nối) (như thể đó là một trường hợp hoàn toàn mới của JVM được tạo sau khi một cá thể khác chạy một lúc). Tôi đoán "giải pháp" tốt nhất có thể phụ thuộc vào bối cảnh cụ thể. Ví dụ, khi xem xét một dịch vụ thương mại điện tử, đôi khi, một vài kết nối với biểu đồ mua sắm không thành công thay vì mất toàn bộ dịch vụ, với rủi ro, làm gián đoạn việc hoàn tất đơn hàng đang diễn ra, hoặc (có thể tệ hơn) một quy trình thanh toán, với tất cả các hậu quả của vụ án (có thể vô hại, nhưng có thể vô hại - và chắc chắn, khi có vấn đề phát sinh,
Tương tự, trên máy trạm, quy trình tiêu tốn nhiều tài nguyên nhất và do đó, việc trở thành lựa chọn đầu tiên cho kẻ giết người OOM, có thể là một ứng dụng cần nhiều bộ nhớ, như trình chuyển mã video hoặc phần mềm kết xuất, có thể là ứng dụng duy nhất người dùng muốn được chạm đến. Cân nhắc này gợi ý cho tôi rằng chính sách mặc định của kẻ giết người OOM quá mạnh mẽ. Nó sử dụng cách tiếp cận "phù hợp nhất" tương tự như một số hệ thống tập tin (OOMK cố gắng và giải phóng bộ nhớ nhiều nhất có thể, đồng thời giảm số lượng các quy trình con bị giết, để ngăn chặn bất kỳ sự can thiệp nào nữa trong thời gian ngắn, như cũng như một fs có thể phân bổ nhiều không gian đĩa hơn sau đó thực sự cần thiết cho một tệp nhất định, để ngăn chặn bất kỳ sự phân bổ nào nữa nếu tệp phát triển và do đó ngăn chặn sự phân mảnh, ở một mức độ nào đó).
Tuy nhiên, tôi nghĩ rằng một chính sách ngược lại, như cách tiếp cận 'phù hợp nhất', có thể tốt hơn, vì vậy để giải phóng bộ nhớ chính xác cần thiết tại một thời điểm nhất định và không bị làm phiền với các quy trình 'lớn', có thể gây lãng phí bộ nhớ, nhưng cũng có thể không, và hạt nhân không thể biết điều đó (hmm, tôi có thể tưởng tượng rằng việc theo dõi số lần truy cập trang và thời gian có thể gợi ý nếu một quá trình phân bổ bộ nhớ thì nó không cần thêm nữa, vì vậy hãy đoán xem liệu một quy trình đang lãng phí bộ nhớ hoặc chỉ sử dụng nhiều, nhưng độ trễ truy cập nên được tính theo chu kỳ cpu để phân biệt lãng phí bộ nhớ với ứng dụng chuyên sâu về bộ nhớ và cpu, nhưng, trong khi có khả năng không chính xác, các heuristic như vậy có thể có quá nhiều chi phí).
Hơn nữa, có thể không đúng khi giết ít quy trình có thể luôn luôn là một lựa chọn tốt. Chẳng hạn, trên môi trường máy tính để bàn (hãy nghĩ về một cái lưới hoặc một chiếc netbook có tài nguyên hạn chế, ví dụ), người dùng có thể đang chạy một trình duyệt có nhiều tab (do đó, tiêu thụ bộ nhớ - giả sử đây là lựa chọn đầu tiên cho OOMK) , cộng với một vài ứng dụng khác (trình xử lý văn bản với dữ liệu không được lưu, ứng dụng thư khách, trình đọc pdf, trình phát đa phương tiện, ...), cùng với một vài trình nền (hệ thống), cùng với một vài phiên bản trình quản lý tệp. Bây giờ, một lỗi OOM xảy ra và OOMK chọn giết trình duyệt trong khi người dùng đang làm điều gì đó được coi là 'quan trọng' qua mạng ... người dùng sẽ thất vọng. Mặt khác, đóng vài trình quản lý tệp '
Dù sao, tôi nghĩ rằng người dùng nên được kích hoạt để tự mình đưa ra quyết định về những việc cần làm. Trong một hệ thống máy tính để bàn (= tương tác), điều đó tương đối dễ thực hiện, cung cấp đủ tài nguyên để yêu cầu người dùng đóng bất kỳ ứng dụng nào (nhưng thậm chí đóng một vài tab có thể là đủ) và xử lý lựa chọn của mình (một tùy chọn có thể bao gồm tạo một tệp hoán đổi bổ sung, nếu có đủ dung lượng). Đối với các dịch vụ (và nói chung), tôi cũng sẽ xem xét hai cải tiến có thể có nữa: một là ghi nhật ký can thiệp giết người OOM, cũng như các quá trình bắt đầu / giả mạo thất bại theo cách mà lỗi có thể dễ dàng gỡ lỗi (ví dụ: API có thể thông báo cho quá trình ban hành quá trình tạo hoặc tạo quy trình mới - do đó, một máy chủ như Apache, với một bản vá thích hợp, có thể cung cấp một bản ghi tốt hơn cho các lỗi nhất định); điều này có thể được thực hiện một cách độc lập từ nỗ lực quá mức / OOMK đang nỗ lực; ở vị trí thứ hai, nhưng không quan trọng, một cơ chế có thể được thiết lập để tinh chỉnh thuật toán OOMK - ở một mức độ nào đó, tôi có thể xác định một chính sách cụ thể trên quy trình theo quy trình, nhưng tôi nhắm đến Cơ chế cấu hình 'tập trung', dựa trên một hoặc nhiều danh sách tên ứng dụng (hoặc id) để xác định các quy trình có liên quan và cung cấp cho chúng một mức độ quan trọng nhất định (theo các thuộc tính được liệt kê); một cơ chế như vậy cũng nên (hoặc ít nhất là có thể) cũng được xếp lớp, để có thể có một danh sách do người dùng xác định cấp cao nhất, danh sách do hệ thống (phân phối-) xác định và các mục được xác định ứng dụng (cấp dưới) , ví dụ, trình quản lý tệp DE có thể ra lệnh cho OOMK tiêu diệt an toàn mọi trường hợp,
Hơn nữa, API có thể được cung cấp để cho phép các ứng dụng tăng hoặc giảm mức độ quan trọng của chúng trong thời gian chạy (liên quan đến mục đích quản lý bộ nhớ và bất kể mức độ ưu tiên thực thi), do đó, ví dụ, bộ xử lý Word có thể bắt đầu mức độ quan trọng thấp nhưng tăng lên khi một số dữ liệu được giữ trước khi xả vào tệp hoặc thao tác ghi đang được thực hiện và mức độ quan trọng thấp hơn một lần nữa khi hoạt động đó kết thúc (tương tự, trình quản lý tệp có thể thay đổi cấp độ khi nó được truyền từ cho phép các tệp xử lý dữ liệu và ngược lại, thay vì sử dụng các quy trình riêng biệt và Apache có thể đưa ra các mức độ quan trọng khác nhau cho những đứa trẻ khác nhau hoặc thay đổi trạng thái con theo một số chính sách được quyết định bởi sysadins và được hiển thị thông qua Apache - hoặc bất kỳ loại máy chủ nào khác - cài đặt). Tất nhiên, một API như vậy có thể và sẽ bị lạm dụng / sử dụng sai, nhưng tôi nghĩ đó là mối quan tâm nhỏ so với hạt nhân tự ý giết chết các quá trình để giải phóng bộ nhớ mà không có bất kỳ thông tin liên quan nào về hệ thống (và mức tiêu thụ bộ nhớ / thời gian tạo hoặc tương tự 'đủ liên quan hoặc' xác thực 'đối với tôi) - chỉ người dùng, quản trị viên và người viết chương trình mới thực sự có thể xác định liệu một quy trình là' vẫn cần thiết 'vì một số lý do, lý do là gì và / hoặc nếu ứng dụng ở trạng thái hàng đầu mất dữ liệu hoặc thiệt hại / rắc rối khác nếu bị giết; tuy nhiên, một số giả định chưa thể được đưa ra, ví dụ như tìm kiếm tài nguyên của một loại nào đó (mô tả tệp, ổ cắm mạng, v.v.) có được bởi một quy trình và với các hoạt động đang chờ xử lý có thể cho biết liệu một quy trình có ở trạng thái 'cao hơn' không một bộ
Hoặc, chỉ cần tránh quá mức và để hạt nhân làm những gì hạt nhân phải làm, phân bổ tài nguyên (nhưng không giải cứu chúng một cách tùy tiện như kẻ giết người OOM), lên lịch xử lý, ngăn chặn nạn đói và bế tắc (hoặc giải cứu chúng), đảm bảo hoàn toàn trước và phân tách không gian bộ nhớ, v.v.
Tôi cũng sẽ dành nhiều lời hơn về các phương pháp tiếp cận quá mức. Từ các cuộc thảo luận khác, tôi đã đưa ra ý tưởng rằng một trong những mối quan tâm chính về vấn đề quá mức (cả lý do muốn nó và là nguồn gốc của những rắc rối có thể xảy ra) bao gồm các cách xử lý: thật lòng, tôi không biết chính xác bản sao như thế nào- chiến lược trên văn bản được thực hiện, nhưng tôi nghĩ rằng bất kỳ chính sách tích cực (hoặc lạc quan) nào cũng có thể được giảm thiểu bằng chiến lược địa phương hoán đổi. Đó là, thay vì chỉ nhân bản (và điều chỉnh) một trang mã quy trình rẽ nhánh và cấu trúc lập lịch, một vài trang dữ liệu khác có thể được sao chép trước khi viết thực tế, chọn trong số các trang mà quy trình cha mẹ đã truy cập để viết thường xuyên hơn (nghĩa là sử dụng một bộ đếm cho các hoạt động ghi).
Tất cả mọi thứ, tất nhiên, IMHO.