Có thể áp đặt một số loại giới hạn mềm đối với mức tiêu thụ bộ nhớ của các quá trình không?


10

Tôi cho rằng đó không phải là một vấn đề hiếm gặp: một quá trình phân bổ số lượng lớn bộ nhớ (có thể là do lỗi rò rỉ bộ nhớ, bởi vì bạn cố xử lý một tệp đầu vào lớn vô cùng, hoặc bất cứ điều gì). RAM đầy lên và đến một lúc nào đó Linux phải chuyển sang trao đổi. Chà, đôi khi đây chỉ là giải pháp cuối cùng: nếu tôi có một tính toán đắt tiền, tôi không muốn mất dữ liệu nếu đến cuối cùng tôi hết RAM.

Tuy nhiên, thường xuyên hơn (theo kinh nghiệm của tôi), mức tiêu thụ bộ nhớ không bị ràng buộc, bởi một quá trình lừa đảo, có lẽ là lỗi. Tức là, tôi không chỉ kết thúc với một số dữ liệu ít cần thiết hơn được chuyển sang trao đổi, nhưng HĐH buộc phải hoán đổi tải dữ liệu một cách hoảng loạn. Và thật không may, nó không chỉ phá vỡ quá trình vi phạm mà còn có thể khiến toàn bộ hệ thống gần như đứng yên (nó không còn tệ như vậy nữa trên các máy có SSD, nhưng OTOH nó khiến tôi lo lắng liệu việc ghi dữ liệu rác và gigabyte có thể trong về lâu dài gây hại cho các tế bào flash).
Cho đến khi tôi nhận thấy sự cố và tự xử lý quá trình (một khi nó thực sự mất vài phút cho đến khi tôi thậm chí đã đăng nhập vào một thiết bị ảo!), Một nửa phiên chạy của tôi đã được trao đổi và tôi cần đợi khá lâu cho đến khi hệ thống chạy trơn tru lần nữa.

Có một giải pháp khắc nghiệt cho vấn đề: thực thi giới hạn bộ nhớ cứng. Nhưng việc thực hiện trên toàn hệ thống này đôi khi sẽ giết chết các quy trình mà tôi vẫn cần, và nếu tôi phải làm thủ công ulimittrước khi bắt đầu một quy trình vi phạm ... tốt, tôi thường sẽ quên cho đến khi quá muộn.

Các loại giải pháp có thể tôi sẽ hạnh phúc hơn với:

  • Nếu bất kỳ quá trình nào vượt quá mức sử dụng bộ nhớ nhất định, thì nó sẽ được điều chỉnh một cách giả tạo để phần còn lại của hệ thống vẫn phản hồi.
  • Nếu bất kỳ quá trình nào vượt quá mức sử dụng bộ nhớ nhất định, thì đó là lúc SIGSTOPtôi có thời gian để tìm hiểu phải làm gì tiếp theo.
  • Nếu một quá trình đạt đến giới hạn RAM, tôi sẽ nhận được cảnh báo, trước khi quá trình hoán đổi lớn bắt đầu.

Có cách nào để có được một hành vi như vậy, hoặc tương tự?


2
Bạn có thể giới hạn dung lượng RAM được sử dụng bởi một quy trình hoặc nhóm quy trình, bằng cách sử dụng các nhóm. stackoverflow.com/questions/3043709/
hy

2
Đây là nghĩa đen của loại chính xác ulimitlà dành cho.
DopeGhoti

1
Ulimit -m sẽ là thứ được sử dụng, ngoại trừ nó không hoạt động trên Linux kể từ 2.4.30 và chỉ hoạt động trong một số tình huống trước đó. unix.stackexchange.com/questions/129587/ Ấn
Mark Plotnick

niceload --noswap yourprg
Ole Tange

Câu trả lời:


6

niceload --noswap yourprg được thực hiện cho chính xác tình huống đó: Nó xem xét hoạt động hoán đổi:

  • Nếu hoán đổi: Hãy để quá trình chạy
  • Nếu hoán đổi trong: Hãy để quá trình chạy
  • Nếu hoán đổi vào và ra: Tạm dừng quá trình cho đến khi hoán đổi dừng lại và tiếp tục quá trình khi hoán đổi đã dừng

Nó không tạm dừng quá trình trước khi bắt đầu hoán đổi, nhưng cho phép trao đổi chạy trong 1 giây trước khi hành động.

niceload --mem 1G yourprghoạt động tương tự: Nếu dưới 1GB thì youprg miễn phí bị treo. Khi có nhiều hơn 1GB thì yourprg được nối lại.


0

Đúng. Nó khá dễ dàng thực hiện với thực tế bất kỳ vỏ hiện đại.

sh -c 'ulimit -S -m "$1"
       shift; exec your_command "$@"
' -- some_size args

Bạn có thể sử dụng -ltùy chọn cho giới hạn bộ nhớ bị khóa. Quá trình của bạn sẽ được báo hiệu nếu vượt quá giới hạn.


-1

Cronjob để xóa bộ đệm: Cách xóa bộ nhớ cache trong Linux

Tôi thực sự có vấn đề tương tự. Tôi có một nhóm người dùng chạy các tập lệnh tùy chỉnh của riêng họ và thỉnh thoảng tập lệnh của họ tiêu thụ tất cả bộ nhớ có sẵn và đưa máy chủ redhat xuống. Lý do cho việc tiêu thụ hàng loạt RAM là vì các tập lệnh của họ có thể chạy trong nhiều ngày chỉ chờ đợi một sự kiện, do đó làm hao mòn tài nguyên khi thực tế nó không sử dụng bất kỳ. Vì vậy, những gì tôi đã làm chỉ đơn giản là buộc xóa bộ nhớ cache bằng cronjob và từ đó không có vấn đề gì.

Đơn giản và lười biếng.


Hừm. Đề nghị thú vị, mặc dù tôi sợ nó không làm gì cho hầu hết các vấn đề tôi gặp phải. Vấn đề chính của tôi là với các quy trình đơn (ứng dụng khoa học) có thể nhanh chóng phân bổ nhiều gigabyte bộ nhớ.
leftaroundabout

Xóa bộ nhớ cache thường giới thiệu các vấn đề hiệu suất. Rất hiếm khi họ giải quyết vấn đề hiệu suất. Nhưng chúng sẽ không khiến bộ nhớ trở nên khả dụng khi không có ở đó.
Gilles 'SO- ngừng trở nên xấu xa'
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.