Làm cách nào để hạn chế sử dụng tài nguyên để tiết kiệm CPU + RAM cho một quy trình nhất định?


25

Tôi có một máy chủ dev mà sshdđôi khi ngừng hoạt động vì máy hết RAM. Có, chúng tôi đang thiếu bộ nhớ và nâng cấp không phải là một lựa chọn khả thi ngay bây giờ. Điều tôi muốn làm là nói với máy: "Hãy làm những gì bạn muốn, nhưng để lại 20 MB và một số CPU cho sshd!".

Làm thế nào có thể được thực hiện?


Sshd không nên nổ tung như vậy, đó thường là một daemon cư xử rất tốt. Hãy chắc chắn rằng nó được cập nhật mới nhất / lớn nhất. Bạn đang làm gì với nó vậy? Bạn đang đường ống dữ liệu lớn thông qua nó?
Marcin

2
@Marcin Tôi không nghĩ mình đang làm gì lớn, chỉnh sửa văn bản. Ngay cả khi sshdhành xử tốt, tôi nghĩ nó sẽ bị kẹt nếu không có đủ CPU / RAM để sử dụng, phải không?
phunehehe

Khi linux hết bộ nhớ, nó bắt đầu tắt các tiến trình để lấy lại bộ nhớ. Bạn có thể thấy OOM hoạt động (hết bộ nhớ sát thủ). Tôi không biết tại sao nó lại quyết định giết sshd của bạn một cách nhất quán. Bạn đã bao giờ thấy sshd thực sự bị rò rỉ (tăng kích thước) khủng khiếp, trước khi nó nổ tung, hoặc nó hoạt động tốt trong một khoảnh khắc và là cái chết tiếp theo?
Marcin

@Marcin cơ hội là nếu anh ấy OOM hệ thống bị sa lầy quá nhiều, anh ta không thể phản hồi, đó không phải là vấn đề sshd mà là vấn đề với tải của anh ta. Thật không may, tôi không biết câu trả lời cho điều này.
xenoterracide

@phunehehe bạn có chắc rằng vấn đề là không có bộ nhớ cho ssh và không phải tải của bạn là qua mái nhà? sshd có lỗi gì không? tải trên hộp là gì? và những gì đang khiến hệ thống hết bộ nhớ.
xenoterracide

Câu trả lời:


9

Bạn có thể có thể đạt được điều gì đó tương tự bằng cách sử dụng các nhóm với bộ điều khiển tài nguyên Bộ nhớ .

Tôi đoán bạn sẽ đặt tất cả các tác vụ tiêu tốn tài nguyên của mình trong một giới hạn (CPU & RAM) cgroupvà để sshd"bên ngoài" để nó không bị hạn chế.

(Thêm nhiều trao đổi, ngay cả ở dạng tệp hoán đổi, có thể là một lựa chọn tốt.)


Tôi vẫn còn do dự, nó không dễ nhìn (hư hỏng bởi Ubuntu).
phunehehe

oh nó chắc chắn không dễ dàng :-) Thêm trao đổi dễ dàng hơn nhiều.
Mat

@phunehehe hoan nghênh trở thành Quản trị viên của Sys, thật không dễ dàng. Nhưng bây giờ bạn phải học cách làm những thứ không dễ dàng.
xenoterracide

6

Oh nhưng cgroups rất dễ :) Cài đặt gói libcgroup. Tạo một /etc/cgconfig.conf:

mount {
    cpu     = /cgroup/cpu_and_mem;
    cpuacct = /cgroup/cpu_and_mem;
    memory  = /cgroup/cpu_and_mem;
}

group sshd {
        cpu {
                cpu.shares="500";
        }
        cpuacct {
                cpuacct.usage="0";
        }
        memory {
                memory.limit_in_bytes="1G";
        }
}

group nosshd {
        cpu {
                cpu.shares="500";
        }
        cpuacct {
                cpuacct.usage="0";
        }
        memory {
                memory.limit_in_bytes="1G";
        }
}

Bắt đầu cgconfigquá trình sẽ tạo cấu trúc phân cấp, nhóm và đặt giới hạn. Nếu thành công, bạn có hai nhóm, cả hai nhóm có 50% CPU được chỉ định và 1G bộ nhớ khả dụng (không biết dung lượng bộ nhớ khả dụng thực tế của bạn là bao nhiêu; giả sử đó là 2G trong ví dụ này). Bây giờ bạn chỉ cần di chuyển tất cả các tác vụ (tức là tất cả các quy trình đang chạy trên hệ thống) từ nhóm gốc vào nhóm nosshd:

cgroup]# cat tasks >> nosshd/tasks
cgroup]# echo > tasks

Sau đó, bạn chỉ cần lấy PID của sshdquá trình và di chuyển thông tin về tệp tác vụ sshd:

cgroup]# echo $PID >> sshd/tasks

Ta-da, bạn đã hoàn thành. Bây giờ bạn có thể yên tâm rằng sshd sẽ luôn có 50% CPU và 1G bộ nhớ.


1

Sử dụng reniceđể có được một ưu tiên cao hơn cho sshd, hoặc kiểm tra kế toán. (acct) -> với điều này, bạn có thể đặt tài nguyên cho người dùng, vì vậy hãy chạy sshd với s


Tôi cũng sẽ thêm ionicevào đó, và có lẽ bắt đầu sshd với việc không đổi tên nó sau.
xenoterracide

1

Một giải pháp tổng quát hơn cho vấn đề sử dụng tài nguyên ứng dụng là chạy các ứng dụng của bạn trong một thùng chứa bằng Docker . Sau đó, bạn có thể chạy các thùng chứa với giới hạn sử dụng CPU và bộ nhớ tương tự như các nhóm.

docker run -c=10 -m=1g my-container
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.