Làm thế nào để hạn chế sử dụng bộ nhớ ứng dụng?


10

Tôi đã dành 2 giờ để đọc các câu hỏi về vấn đề này, và vẫn có một số hiểu lầm.

Tôi có quá trình này:

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND    
root 1452 0.4 1.8 1397012 19308 ? Sl 04:23 3:48 ./transaction_server

Điều này cho thấy nó sử dụng 19.3Mbbộ nhớ cư trú hệ thống (tôi không có tệp hoán đổi), xung quanh 1.8%toàn 1GBbộ bộ nhớ hệ thống. Kích thước ảo là 1.39GB?!?. Tôi đã đọc ulimit -mnó không hoạt động. Mọi người sử dụng ulimit -vví dụ như thiết lập bộ nhớ ảo cho quá trình. Bộ nhớ ảo này có phải là một VSZ được liệt kê pskhông? Giá trị nào tôi nên đặt nếu tôi muốn hạn chế quá trình này sử dụng tối đa 100MBbộ nhớ hệ thống. Tôi đã đọc tài liệu cho setrlimitvà điều này có vẻ hợp pháp:

RLIMIT_AS
        This  is  the maximum size of a process' total available memory, 
        in bytes. If this limit is exceeded, the malloc() and mmap() 
        functions shall fail with errno set to [ENOMEM]. In addition, 
        the automatic stack growth fails with the effects outlined above.

Nhưng trên các phiên bản khác của tài liệu, RLIMIT_AStham số này đặt kích thước bộ nhớ ảo. Sự thật là gì?


Xin vui lòng, chú ý đến định dạng bài.
rozcietrzewiacz

Câu trả lời:


6

Vâng, VSZ là bộ nhớ ảo. Đối với RLIMIT_AS, bạn đã tìm thấy đoạn trích dẫn ở trên ở đâu? Vì setrlimit (2) là một cuộc gọi hệ thống Linux, tôi không thấy cách nó có thể giám sát malloc (3), một chức năng thư viện. Thay vào đó, nó chỉ có thể hoạt động với brk (2), sbrk (2) và mmap (2) - đây cũng là những gì trang web của nó (đã kiểm tra của Linux Linux). Tuy nhiên, tổng dung lượng bộ nhớ được yêu cầu thông qua các chức năng này là bộ nhớ ảo, do đó RLIMIT_AS thực sự giới hạn bộ nhớ ảo. (Đây là, một lần nữa, phù hợp với trang chủ setrlimit (2).)

Thật không may, bạn không thể giới hạn RSS trong Linux (điều này sẽ xảy ra ulimit -m). Bạn có thể thử ulimit -d(RLIMIT_DATA), nhưng điều này sẽ bỏ qua mmap (2), thường được sử dụng để phân bổ lớn. Một khả năng khác là hạn chế bộ nhớ ảo, nhưng với sự khác biệt lớn như vậy giữa RSS và VSZ, điều này có thể khó khăn.


Cảm ơn bạn vì câu trả lời. Đoạn văn từ setrlimittrang man IEEE/The Open Group 2003 GETRLIMIT(3P)Làm thế nào pscó thể hiển thị cho tôi RSS, nhưng hạt nhân không thể thực thi giới hạn đối với nó?
Dragomir Ivanov

6
Theo Alan Cox, điều này có lý do lịch sử: tính toán RSS được sử dụng là tốn kém, do đó, việc thực thi giới hạn sẽ đặt một tải trọng lớn lên kernel; nguồn: linux.derkeiler.com/Mending-Lists/Kernel/2006-01/msg03306.html . Xem thêm stackoverflow.com/questions/3043709/
Mạnh

Tôi hiểu rồi. Tôi đoán tôi sẽ đi với ulimit -dsau đó. Ứng dụng này được viết bởi tôi và tôi đã không sử dụng mmap().
Dragomir Ivanov

2
Không, bạn thường không (cũng không phải sbrk ()), nhưng malloc () có thể.
Ansgar Esztermann

Tôi hiểu rồi. Điều đó rất đáng tiếc. Vì vậy, giải pháp cho câu hỏi này sau đó, là nhóm, hoặc thăm dò sử dụng bộ nhớ với một số ngôn ngữ kịch bản.
Dragomir Ivanov

3

Nhiều quy trình chia sẻ một số bộ nhớ của nó với các quy trình khác, ví dụ libc được sử dụng bởi gần như mọi quy trình nhưng chỉ được ánh xạ trong bộ nhớ một lần, nhưng nó được tính vào việc sử dụng bộ nhớ ảo của mọi quy trình. Hạn chế sử dụng bộ nhớ chỉ được sử dụng bởi một quy trình nhất định (chủ yếu là RSS) có thể được thực hiện bằng cách sử dụng các nhóm. Xem câu trả lời cho Cách giới hạn tổng tài nguyên (bộ nhớ) của một quy trình và các phần tử con của nó để biết cách thực hiện. Điều này sẽ giới hạn tổng bộ nhớ của một quá trình và con của nó.

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.