Làm thế nào để tôi tự động tiêu diệt các quá trình rò rỉ bộ nhớ?


8

Tôi có vấn đề với các quá trình rò rỉ bộ nhớ. Chúng làm cho ổ cứng của tôi chứa đầy các tệp hoán đổi /private/var/vm.

Tôi muốn các quy trình bị rò rỉ sẽ bị hệ điều hành giết chết ngay trước mắt . Tôi không quan tâm đến hộp thoại xuất hiện sau 20 phút, gợi ý các ứng dụng sẽ bị hủy và thậm chí không hiển thị hộp thoại bị rò rỉ.

Tôi đã thử thiết lập rssdatagiới hạn trong /etc/launchd.confnhưng dường như nó không có hiệu lực.

Đây là của tôi /etc/launchd.conf:

limit data 8589934592 8589934592
limit rss 8589934592 8589934592

Đây là launchctl limitđầu ra:

% launchctl limit
    cpu         unlimited      unlimited
    filesize    unlimited      unlimited
    data        8589934592     8589934592
    stack       8388608        67104768
    core        0              unlimited
    rss         8589934592     8589934592
    memlock     unlimited      unlimited
    maxproc     709            1064
    maxfiles    256            unlimited

Đây là của tôi .zshrc:

ulimit -t 600
ulimit -d 512000
ulimit -v 1024000

ulimit -ađầu ra (trong ZSH):

% ulimit -a
    -t: cpu time (seconds)         600
    -f: file size (blocks)         unlimited
    -d: data seg size (kbytes)     512000
    -s: stack size (kbytes)        8192
    -c: core file size (blocks)    0
    -v: address space (kb)         1000
    -l: locked-in-memory size (kb) unlimited
    -u: processes                  709
    -n: file descriptors           256

Tuy nhiên, đây là những gì topcho tôi biết về quá trình:

PID  COMMAND      %CPU  TIME     #TH  #WQ  #POR #MRE RPRVT  RSHRD  RSIZE  VPRVT  VSIZE  PGRP PPID
886  process      30.8  01:16.40 1/1  0    17   332  2259M+ 184K   2072M- 19G+   38G    882  885

Dường như không có phương pháp giới hạn bộ nhớ tài liệu nào thực sự hoạt động. Có một cơ chế bổ sung mà tôi có thể đã bỏ lỡ?


230 GiB?! Tôi thực sự hy vọng bạn bỏ lỡ một dấu thập phân.
duci9y

@ duci9y Không :-(
sam hocevar

3
Trong trường hợp đó, tôi thực sự hy vọng ai đó sẽ khắc phục vấn đề của bạn. Bạn sẽ ở trong những lời cầu nguyện của tôi.
duci9y

Cuối cùng tôi đã gỡ bỏ đề cập đến quá trình rò rỉ là gì bởi vì mọi người trên IRC bắt đầu giảng cho tôi lý do tại sao tôi nên sử dụng clang ++ thay vì llvm-g ++ và điều đó chỉ khiến tôi muốn đánh chúng bằng các vật nhọn.
sam hocevar

Vật nhọn trên lửa.
duci9y

Câu trả lời:


3

Tôi sẽ tạo một tập lệnh đơn giản để lọc quá trình bất kỳ quy trình nào với kích thước bộ nhớ lưu trú (hoặc có thể là tổng kích thước vm, bao gồm mọi trang được phân trang) lớn hơn ngưỡng mà tôi xác định (tùy thuộc vào số lượng quy trình, tổng bộ nhớ khả dụng và có lẽ cũng có sẵn CPU). Người ta có thể sử dụng một chút tập lệnh bash với tophoặc psđể tìm ra danh sách quy trình và kích thước bộ nhớ.

Từ danh sách được lọc này, tôi sẽ sử dụng leakslệnh (xem man 1 rò rỉ ) cho mỗi quá trình PID. Nếu tổng số lượng bộ nhớ bị rò rỉ được báo cáo bởi lệnh cao hơn ngưỡng khác, thì tôi sẽ giết và hồi sinh nó.

LƯU Ý : Bạn nên cẩn thận không giết bất kỳ quy trình HĐH / Hệ thống nào mà không biết bạn làm gì. Để tránh tình trạng này, có lẽ bạn nên lọc ra danh sách bằng cách sử dụng phương pháp "danh sách trắng".


1

ulimit trên hầu hết các nền tảng không hoạt động như mong đợi.

Nếu đây không phải là ứng dụng dành cho máy tính để bàn, hãy chạy người vi phạm với người giám sát quy trình thích hợp, chẳng hạn như https://github.com/arya/bluepill

Nếu đây là một ứng dụng máy tính để bàn, hãy liên hệ với các nhà phát triển ứng dụng. Phản hồi là cần thiết và quan trọng.

UX trên GUI sát thủ OOM cho Mac thật kinh khủng. Nó nên được sắp xếp giảm dần lớn nhất với biểu đồ thanh tỷ lệ cho việc sử dụng ram của mỗi quy trình. Hơn nữa, nó sẽ tự động SIGCONT tất cả các quá trình tạm dừng khi được giải quyết.


1
Tôi đã gặp vấn đề với một số ứng dụng, nhưng ống hút làm vỡ lưng con lạc đà là của Apple llvm-g++. Vấn đề đã được báo cáo trong Radar. Tôi tò mò: nền tảng nào khác không hoạt động ulimit? Tôi đã sử dụng một số hương vị của Unix trong gần 20 năm và tôi không nhớ đã nhìn thấy nó.
sam hocevar

-2

Nếu bạn cần điều này trên các lần khởi động lại, bạn chỉ nên sử dụng launchctl limitlệnh.

Nếu bạn cần giới hạn bộ nhớ của ứng dụng, bạn cũng nên giới hạn phân đoạn ngăn xếp.


Như bạn có thể thấy trong đầu ra, cả kích thước ngăn xếp và kích thước dữ liệu đều bị giới hạn. Tôi hỏi những câu hỏi vì launchctl limitkhông không làm việc.
sam hocevar

ulimitbạn sử dụng thực sự không hoạt động như bạn cần. launchctl limitlàm.
Eir Nym

và một khoảnh khắc khác được chiếu sáng trong giới hạn: khi chương trình đạt đến giới hạn, nó sẽ nhận được cảnh báo. nhưng với hành động giới hạn mềm sẽ được thực hiện thành công, với khó - nó sẽ thất bại. Vì vậy, nếu chương trình yêu cầu bộ nhớ vượt quá giới hạn cứng, sẽ không có bộ nhớ nào được phân bổ.
Eir Nym

launchctl limitkhông không làm việc, hoặc tôi sẽ không được đặt câu hỏi.
sam hocevar

Làm thế nào để bạn đo kích thước ứng dụng?
Eir Nym
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.