Giải pháp hạn chế bộ nhớ cho các ứng dụng tham lam có thể làm sập hệ điều hành?


32

Tôi sử dụng máy tính của tôi để lập trình khoa học. Nó có sức khỏe 8GBcủa RAM và 12GBkhông gian trao đổi. Thông thường, khi các vấn đề của tôi đã trở nên lớn hơn, tôi vượt quá tất cả các RAM có sẵn. Thay vì sụp đổ (sẽ được ưu tiên), có vẻ như Ubuntu bắt đầu tải mọi thứ vào trao đổi, bao gồm cả Unity và bất kỳ thiết bị đầu cuối mở nào. Nếu tôi không kịp thời chạy chương trình, tôi không thể làm gì ngoài việc chờ đợi - phải mất 4-5 phút để chuyển sang dấu nhắc lệnh, vd. Ctrl-Alt-F2nơi tôi có thể giết quá trình vi phạm.

Vì sự ngu ngốc của tôi nằm ngoài phạm vi của diễn đàn này, làm thế nào tôi có thể ngăn Ubuntu bị sập khi đập, khi tôi sử dụng hết bộ nhớ có sẵn từ một chương trình vi phạm?

Thử nghiệm tại nhà *!

Mở một thiết bị đầu cuối, khởi chạy pythonvà nếu bạn đã numpycài đặt thử điều này:

>>> import numpy
>>> [numpy.zeros((10**4, 10**4)) for _ in xrange(50)]

* Cảnh báo: có thể có tác dụng phụ, theo dõi quá trình thông qua iotophoặc toptiêu diệt kịp thời. Nếu không, tôi sẽ gặp lại bạn sau khi khởi động lại.

Câu trả lời:


21

Shell tích hợp ulimitcho phép bạn hạn chế tài nguyên. Đối với trường hợp của bạn, để hạn chế sử dụng bộ nhớ trong vỏ (và con của nó), hãy sử dụng ulimit -v.

Trình diễn cài đặt giới hạn bộ nhớ là 100 MB (100000 KB):

$ ulimit -v
unlimited
$ python -c '[ "x" * 100000000 ]'
$ ulimit -v 100000
$ python -c '[ "x" * 100000000 ]'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
MemoryError

Người ta quan sát thấy ps uww -C script-name-hererằng python cần ít nhất 29 MB bộ nhớ (cột VSZ). Giới hạn RSS tăng lên khi tập lệnh python của bạn cần nhiều bộ nhớ hơn để điều chỉnh cột đó.


1
Quá tệ, chúng tôi không biết ứng dụng thực tế trông như thế nào. Các ulimit như đã chứng minh tác động đến tất cả các quá trình là con của vỏ đó. Chúng tôi thậm chí không biết nếu nó chạy như một daemon, hoặc nếu nó có rất nhiều trẻ em sẽ làm phức tạp thêm mọi thứ. Xem coldattic.info/shvedsky/pro/blogs/a-foo-walks-into-a-bar/posts/...
ppetraki

1
Không có front-end thân thiện với người dùng cho ulimit và cgroups ? Trong Windows, khi HĐH sắp hết RAM, một cảnh báo bật lên luôn cho phép tôi tránh bị đóng băng hệ thống. Trong Ubuntu, tôi có phải để mắt đến việc sử dụng bộ nhớ mọi lúc không?
Dan Dascalescu

1
@DanDascalescu Nếu bạn có một tệp hoán đổi được cấu hình, thì bạn sẽ phải chịu sự chậm trễ lâu hơn nhưng vẫn có thể làm việc. Khi bạn nhận thấy rằng việc hoán đổi bắt đầu, bạn có thể kiểm tra màn hình hệ thống để sử dụng RAM. Nếu hệ thống của bạn thực sự hết bộ nhớ, kẻ giết người hết bộ nhớ (OOM) được gọi sẽ giết chết một quá trình có điểm "xấu" cao nhất (thường là quá trình tiêu tốn nhiều bộ nhớ nhất).
Lekensteyn

12

Các nhóm nên cho phép bạn giới hạn việc sử dụng bộ nhớ trên cơ sở mỗi quy trình.

https://en.wikipedia.org/wiki/Cgroups

http://www.mjmwired.net/kernel/Documentation/cgroups/memory.txt

Điện toán khoa học nổi tiếng là chiếm nhiều bộ nhớ, bằng cách đóng hộp ứng dụng của bạn trong một nhóm, phần còn lại của các quy trình sẽ không trở thành nạn nhân vì áp lực bộ nhớ sẽ giảm bớt.

Ngoài ra, VM có thể được sử dụng như một loại giới hạn cứng vì ứng dụng chỉ có thể sử dụng bộ nhớ được ủy quyền cho máy ảo, với chi phí hiệu năng là điều tất nhiên. Tuy nhiên, VM dễ cấu hình hơn cho người không quen khi so sánh với việc thiết lập và duy trì một nhóm.

Quyết định quyết định :) Chúc may mắn!


1
Không có front-end thân thiện với người dùng cho ulimit và cgroups? Trong Windows, khi HĐH sắp hết RAM, một cảnh báo bật lên luôn cho phép tôi tránh bị đóng băng hệ thống. Trong Ubuntu, tôi có phải để mắt đến việc sử dụng bộ nhớ mọi lúc không?
Dan Dascalescu

Không. Ngoài ra, hệ điều hành của bạn không nên bị đóng băng, đó là một vấn đề riêng biệt. Các cửa sổ bật lên chỉ là một dải băng để bắt đầu. Nếu bạn đang sử dụng hàng tấn bộ nhớ, có lẽ bạn nên điều tra tại sao? Ví dụ, các trình duyệt hiện đại với sanboxing của họ có thể dễ dàng tiêu thụ 70-150M PER TAB. Tắt hoặc điều chỉnh nó có thể giải phóng bộ nhớ đáng kể được sử dụng thường xuyên bởi người dùng cuối. Bộ lập lịch được yêu cầu hoán đổi các chương trình ít được sử dụng để tiết kiệm dung lượng nhưng nếu chúng thức dậy nhiều hơn thì bạn cần phải sửa chúng hoặc nếu tác vụ chính của bạn là bộ nhớ (web) thì cần nhiều ram hơn.
ppetraki

8
Tôi biết những gì tiêu thụ bộ nhớ - Chrome. Nhưng HĐH nên bảo vệ sự ổn định của nó trước các ứng dụng chạy amok.
Dan Dascalescu

1
Tôi hiểu bạn đến từ đâu với tư cách là người dùng. Tuy nhiên, những gì bạn đang yêu cầu có nghĩa là biến một nền tảng điện toán chung thành một thiết bị. Là phương pháp ít phức tạp nhất (dễ bị lỗi), một kỹ sư hệ điều hành phải thực hiện để cung cấp các biện pháp bảo vệ đó là đưa ra các quyết định có ý kiến ​​sâu sắc về cách toàn bộ máy tính được chạy. Điều đó thường đi kèm với chi phí linh hoạt của người dùng cuối. Bạn thấy các ví dụ về điều này trong máy tính bảng. Trong máy tính để bàn tuy nhiên tính linh hoạt được bảo tồn.
ppetraki
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.