Hết trao đổi - chuyện gì xảy ra?


8

Trên máy Debian VM của tôi có RAM 512 MB và trao đổi 348 MB, điều gì sẽ xảy ra nếu tôi mở tệp 1 GB trong trình chỉnh sửa và hết bộ nhớ?

Nó sẽ sụp đổ hệ thống? Hoặc nếu không, Linux sẽ xử lý việc này như thế nào?

Sẽ không khôn ngoan khi cài đặt Swapspace vì vậy nếu cần sẽ được tạo đủ trao đổi tự động và linh hoạt?

sudo apt-get install swapspace

Tại sao bạn không trao đổi nhiều hơn?
guntbert


1
Lưu ý rằng một số biên tập viên chỉ ghi bản đồ tệp và không tải nó lên trước, điều này khắc phục hoàn toàn vấn đề khi họ sử dụng chính tệp nguồn là 'trao đổi'.
Vality

Câu trả lời:


17

Nó phụ thuộc vào các cài đặt bạn đang chạy, đặc biệt là bộ nhớ quá mức ( /proc/sys/vm/overcommit_memory; xem man 5 procchi tiết).

Nếu bộ nhớ thừa bị vô hiệu hóa, trình soạn thảo (và có thể các chương trình khác cố gắng cùng lúc) cố gắng phân bổ bộ nhớ sẽ thất bại. Họ sẽ nhận được kết quả thất bại từ cuộc gọi hệ thống. Tùy thuộc vào từng chương trình để xử lý việc này, mặc dù một kết quả chung không may là chương trình bị sập. Trình chỉnh sửa cũng có thể, ví dụ, chỉ từ chối mở tệp.

Nếu bộ nhớ quá mức được bật, thì bộ nhớ yêu cầu cuộc gọi hệ thống cũng có thể thành công. Trong trường hợp đó, khi bộ nhớ thực sự được truy cập, kernel sẽ thông báo hết bộ nhớ và giết một quá trình để lấy lại bộ nhớ. Quá trình đó có thể hoặc không thể là biên tập viên. Sự lựa chọn được điều chỉnh bởi oom_score(kết quả của một số heuristic hạt nhân) và oom_score_adj(được cấu hình) của mỗi quá trình trên hệ thống. Đó cũng là trong trang web của Proc (5).


5

Có một vấn đề lớn trong Linux trong trường hợp này nếu bạn tiếp cận với tình trạng hết bộ nhớ - bạn sẽ nhận thấy rằng toàn bộ hệ thống của bạn trở nên hoàn toàn không phản hồi vì nó bắt đầu hoán đổi rất nhiều. Ngay cả con trỏ chuột của bạn cũng có thể trở nên 'chậm' đến mức bạn không thể khởi động thiết bị đầu cuối và giết chết quá trình ăn bộ nhớ vi phạm theo cách thủ công. Điều này là do số lượng lớn các hoạt động đĩa.

Để tránh tình trạng này, cá nhân tôi thường vô hiệu hóa hoàn toàn trao đổi, vì vậy nhân Linux luôn phản ứng nhanh và trong trường hợp xấu nhất, kẻ giết người hết bộ nhớ (OOM) sẽ giết chết một số tiến trình. Logic của quá trình bị giết bởi OOM phụ thuộc vào phiên bản kernel.

Vì vậy, câu trả lời là không - không cho phép phân bổ trao đổi động. Bạn sẽ phải đối mặt với máy treo.

Thật dễ dàng để dùng thử với chương trình liên tục phân bổ một số bộ nhớ trong một vòng lặp. Lưu chương trình này vào một tệp văn bản , memeater.c:

#include <stdlib.h>

int main() {
    for (;;) {char* mem=malloc(4096); mem[0]=1;};
}

Sau đó biên dịch nó:

$ gcc memeater.c -o memeater

và chạy:

$ ./memeater

Hãy thử với hoán đổi, không trao đổi và với phân bổ trao đổi động của bạn.

Ngoài ra, hãy nhớ rằng trong hầu hết các trường hợp, tình trạng OOM này xảy ra do lỗi phần mềm (rò rỉ bộ nhớ) hoặc bạn đã làm gì đó sai như 'tải tệp 10 GB này trong trình chỉnh sửa' hoặc 'chạy quá nhiều tệp đồ họa thay đổi kích thước song song' và làm kết luận: Bạn có cần trao đổi hay không?


1
+1 để đề xuất phương pháp đơn giản để tự kiểm tra
rubo77

1
Nó trả lời câu hỏi thứ hai "có phải là ý tưởng tốt để sử dụng phân bổ hoán đổi động".
gena2x

@ gena2x Vâng, đó là một ý tưởng rất hay, bởi vì nó làm cho hệ thống của bạn phản ứng nhanh hơn trong các tình huống quá tải, thay vì giết từng nhiệm vụ của bạn. -1. Mặc dù tốt nhất nếu bạn có một phân vùng trao đổi lớn, cố định, nhưng nó có một nguyên nhân khác (giảm phân mảnh trao đổi).
peterh - Phục hồi Monica

Nếu bạn có trao đổi cố định lớn, hệ thống của bạn sẽ không phản hồi vì nó sẽ cố gắng trao đổi các tác vụ đang hoạt động sang đĩa và chúng trao đổi chúng mãi mãi.
gena2x
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.