Làm thế nào để vm.overcommit_memory hoạt động?


49

Khi tôi sử dụng các cài đặt mặc định:

vm.overcommit_memory = 0
vm.overcommit_ratio = 50

Tôi có thể đọc các giá trị này từ /proc/meminfotệp:

CommitLimit:     2609604 kB
Committed_AS:    1579976 kB

Nhưng khi tôi thay đổi vm.overcommit_memorytừ 0sang 2, tôi không thể khởi động cùng một bộ ứng dụng mà tôi có thể bắt đầu trước khi thay đổi, đặc biệt là amarok. Tôi đã phải thay đổi vm.overcommit_ratiođể 300, vì vậy giới hạn có thể được tăng lên. Bây giờ khi tôi bắt đầu amarok, /proc/meminfohiển thị như sau:

CommitLimit:     5171884 kB
Committed_AS:    3929668 kB

Máy này chỉ có 1GiB RAM, nhưng amarok hoạt động mà không gặp vấn đề gì khi vm.overcommit_memoryđược đặt thành 0. Nhưng trong trường hợp cài đặt thành 2, amarok cần phân bổ hơn 2GiB bộ nhớ. Đó có phải là một hành vi bình thường? Nếu vậy, có ai có thể giải thích tại sao, ví dụ, firefox (tiêu thụ bộ nhớ nhiều hơn 4 - 6 lần so với amarok) hoạt động theo cùng một cách trước và sau khi thay đổi không?

Câu trả lời:


66

Bạn có thể tìm tài liệu trong man 5 proc( hoặc tại kernel.org ):

/proc/sys/vm/overcommit_memory
       This file contains the kernel virtual memory accounting mode.
       Values are:

              0: heuristic overcommit (this is the default)
              1: always overcommit, never check
              2: always check, never overcommit

       In mode 0, calls of mmap(2) with MAP_NORESERVE are not
       checked, and the default check is very weak, leading to the
       risk of getting a process "OOM-killed".

       In mode 2 (available since Linux 2.6), the total virtual
       address space that can be allocated (CommitLimit in /proc/mem‐
       info) is calculated as

           CommitLimit = (total_RAM - total_huge_TLB) *
                         overcommit_ratio / 100 + total_swap

Câu trả lời đơn giản là cài đặt overcommit thành 1, sẽ đặt giai đoạn để khi chương trình gọi một thứ gì đó giống như malloc()phân bổ một đoạn bộ nhớ ( man 3 malloc), nó sẽ luôn thành công bất kể hệ thống có biết nó sẽ không có tất cả bộ nhớ đang tồn tại không yêu cầu.

Khái niệm cơ bản để hiểu là ý tưởng về bộ nhớ ảo . Các chương trình thấy một không gian địa chỉ ảo có thể hoặc không thể được ánh xạ tới bộ nhớ vật lý thực tế. Bằng cách vô hiệu hóa kiểm tra quá mức, bạn nói với HĐH chỉ cho rằng luôn có đủ bộ nhớ vật lý để sao lưu không gian ảo.

Thí dụ

Để làm nổi bật lý do tại sao điều này đôi khi có thể quan trọng, hãy xem hướng dẫn của Redis về lý do tại sao vm.overcommit_memorynên được đặt thành 1 cho nó.


2
Nhưng không phải giá trị Committed_ASlà như nhau trong cả hai trường hợp?
Mikhail Morfikov

@MikhailMorfikov: Về lý thuyết, tôi tin là như vậy, nhưng ai biết những chương trình này đang làm gì. Bạn muốn thấy một môi trường được kiểm soát nhiều hơn với một chương trình đơn giản chỉ cần phân bổ nói một loạt ram thông qua Malloc. Và sau đó chạy thử nghiệm sau khi khởi động lại giữa các thử nghiệm.
Kyle Brandt

Ok, vì vậy tôi sẽ ở lại với 0bây giờ.
Mikhail Morfikov

2
@MikhailMorfikov: Vâng, thực tế tôi nghĩ 0 có ý nghĩa nhất. Trong môi trường của tôi, lần duy nhất tôi kích hoạt 1 là cho Redis, công cụ mà nó mong đợi sẽ yêu cầu nhiều bộ nhớ hơn mà nó đang sử dụng do một ngã ba (). Đứa trẻ sẽ sử dụng khá nhiều tất cả các trang bộ nhớ giống nhau, nhưng Linux không biết rằng để an toàn, nó phải giả sử bộ nhớ 2x sẽ được sử dụng (nếu bạn muốn tìm hiểu thêm: redis.io/topics/faq )
Kyle Brandt

câu nói cuối cùng trong câu trả lời của bạn có nên bắt đầu như "bằng cách cho phép quá mức" không? bởi vì đặt nó thành 1 có nghĩa là bạn đang yêu cầu nó quá mức, phải không?
vào
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.