Tại sao một số không gian hoán đổi của tôi được sử dụng, khi tôi vẫn còn RAM chưa sử dụng?


9

Nhiều hơn một sự tò mò hơn là một vấn đề; và, tôi thừa nhận, một cái gì đó của một câu hỏi cơ bản khó hiểu:

Tôi đã nhận thấy rằng trong nhiều trường hợp, trên máy Linux của tôi, tôi sẽ có ~ 500 MB dung lượng trao đổi được sử dụng, mặc dù tôi có ~ 600 MB RAM không sử dụng.

Sự hiểu biết cấp cao ngây thơ của tôi là, không gian hoán đổi không hoạt động cho đến khi hết RAM.

Tôi đã đi xa hơn và đưa ra giả định rằng tình huống này phải là do nhân Linux, vì một quá trình người dùng yêu cầu bộ nhớ, chỉ thực hiện một cách logic và không có ý tưởng nào về việc bộ nhớ đó được hỗ trợ vật lý bởi RAM hay không gian trao đổi.

Điều này dẫn đến câu hỏi, tại sao hạt nhân lại sử dụng không gian hoán đổi? Đây có phải là một phần của một số thuật toán điều chỉnh hiệu suất? Có phải nó được trao đổi với các phần của bộ nhớ mà nó cho là ít có khả năng được truy cập nhất (có thể là sơ đồ LRU)? Nếu vậy, sẽ không có ý nghĩa gì khi để lại mọi thứ trong RAM, và chỉ khi gần cạn kiệt, sau đó và chỉ sau đó hoán đổi các phần LRU từ RAM sang không gian trao đổi?

Tôi nên làm rõ, máy chủ linux của tôi có 2GB RAM và 2GB dung lượng trao đổi.


1
Tại sao 4 phiếu để đóng câu hỏi này?

2
@Aaron: Không phải là bạn có một câu hỏi tồi. Bạn vừa thực hiện nó về mặt quản lý hệ thống để phù hợp hơn với người dùng quyền lực hoặc quản trị viên máy chủ. Rằng bạn tự hỏi về nó như một sự tò mò có vẻ giống như một người dùng quyền lực POV.

Câu trả lời:


11

Phần không sử dụng của RAM trên thực tế được sử dụng làm bộ nhớ cache của ổ cứng. Nếu bạn nghĩ về nó, bạn thực sự đọc các phần của đĩa thường xuyên hơn khi bạn truy cập vào một số phần của RAM. Điều này có ý nghĩa để đặt RAM này vào đĩa, trong khi sử dụng RAM để lưu trữ dữ liệu ổ cứng.


7

Thật ý nghĩa khi trao đổi mọi thứ trước vì khi bạn thực sự cần bộ nhớ, bạn sẽ không phải đợi cho đến khi kernel hoàn thành với quyền truy cập đĩa.

Ví dụ: giả sử bạn muốn mở một hình ảnh lớn. Khi hình ảnh được tải, nó sẽ mất 300 MB RAM. Nếu kernel sử dụng tất cả RAM có thể, việc tải hình ảnh của bạn yêu cầu kernel chuyển 200MB từ RAM sang đĩa. Nếu nó chủ động làm trống RAM trước, bạn sẽ tiết kiệm được vài mili giây.


7

2 lý do:

  1. (@dtrosset) Linux sẽ trao đổi các bit chương trình không sử dụng để cung cấp thêm bộ đệm và bộ đệm.
  2. Bạn có thể đã sử dụng nhiều bộ nhớ hơn trong quá khứ và hoán đổi một số thứ và nó không bị tráo đổi vì nó không được sử dụng, mặc dù mọi thứ đã bị loại bỏ.

1

Ngoài các câu trả lời khác, bạn có thể định cấu hình Linux để yêu cầu sao lưu cho mọi bộ nhớ được phân bổ, ngay cả khi các chương trình không sử dụng nó.

Tuy nhiên, bộ nhớ quá mức và sợ kẻ giết OOM không phải là những phần cần thiết trong trải nghiệm Linux. Chỉ cần đặt tham số sysctl vm / overcommit_memory thành 2 sẽ tắt hành vi overcommit và giữ cho kẻ giết người OOM mãi mãi ở lại. Hầu hết các hệ thống hiện đại nên có đủ dung lượng đĩa để cung cấp tệp hoán đổi rộng rãi cho hầu hết các tình huống. Thay vì cố gắng giữ cho các quá trình thú cưng không bị giết khi hết bộ nhớ quá mức, có thể dễ dàng hơn để tránh tình trạng này hoàn toàn. [ Thay thế từ kẻ giết người OOM ]

Nếu một chương trình phân bổ bộ nhớ, kernel chỉ có thể đánh dấu nhiều trang trao đổi hơn như đã cam kết. Dấu hiệu này được lưu trong trình quản lý bộ nhớ của kernel, không gian đĩa thực sự chưa được chạm vào. Cho đến khi bộ nhớ được sử dụng, không có gì thực sự phải hoán đổi trong và ngoài. Nếu chúng không bao giờ được sử dụng, thì việc sử dụng trao đổi sẽ dao động mà không ảnh hưởng đến hiệu suất.

Bởi vì các quy trình được trình bày với không gian địa chỉ của riêng họ hoặc "chế độ xem" (đây là cách trao đổi hoạt động ở vị trí đầu tiên), hạt nhân có rất nhiều sự chậm trễ trong cách quản lý điều đó. Sử dụng một ví dụ về ngã ba cũng từ bài viết được liên kết ở trên, vì nó có nhiều khả năng có các trang bộ nhớ chia sẻ hơn là phân bổ mới một lượng lớn bộ nhớ không sử dụng, bộ nhớ có thể được cấp phát sao chép, tăng số lần sử dụng trao đổi. Khi nó thực sự được ghi vào (điều này có thể không xảy ra), thì "hoán đổi đã cam kết" có thể được thay thế bằng bất kỳ RAM không sử dụng nào (sau đó tăng sử dụng RAM và giảm sử dụng trao đổi). Hãy tưởng tượng một quá trình với 500 MB được phân bổ sẽ tạo ra một máy tính có tất cả hoặc gần như toàn bộ RAM đang sử dụng. Nếu có 500 MB có sẵn trong trao đổi (và dung lượng ổ đĩa rẻ, thì 1% ổ TB ngày nay lớn đến mức nào ?: P), không có bộ nhớ nào phải được sao chép (chưa,

Do đó, khả năng của kẻ giết người OOM là tránh được, và việc thiết kế hầu hết các phần mềm đơn giản hơn với giả định rằng việc phân bổ bộ nhớ (bao gồm cả phân bổ "ngầm" thông qua một cái gì đó như ngã ba) có thể thành công hoặc thất bại ngay lập tức, với nhận thức thực tế rằng nếu bộ nhớ phải hoán đổi sau đó nó có thể ảnh hưởng đến hiệu suất. Tác động đó hầu như luôn luôn nhẹ, nhưng trong trường hợp xấu nhất dẫn đến hoán đổi trao đổi (đôi khi vẫn thích hợp hơn cho một vụ tai nạn hạt nhân hoàn toàn hoặc kẻ giết người OOM).

Mặc dù tôi không biết chi tiết chính xác về cách trình quản lý bộ nhớ Linux hoạt động, câu trả lời này là sự hiểu biết khái quát của riêng tôi và những gì tôi nhớ đã đọc trong nhiều năm qua. Tôi đã cố gắng chỉnh sửa lại câu trả lời này để hiểu biết tối thiểu về thiết kế HĐH (nó khá phức tạp và không phải là thứ tôi cực kỳ quan tâm đến bản thân mình), nhưng nó có vẻ lan man một chút; xin vui lòng cho tôi biết nếu bạn thấy nó có thể được cải thiện như thế nào. Trên bàn tay nắm bắt, nó có thể không phải là một câu hỏi cơ bản đáng xấu hổ.

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.