2009-03-01 35 views
27

Tôi muốn buộc hạt nhân Linux phân bổ bộ nhớ nhiều hơn cho các ứng dụng sau khi bộ nhớ cache bắt đầu chiếm quá nhiều bộ nhớ (như có thể thấy bởi đầu ra 'miễn phí').Làm thế nào để dọn dẹp bộ nhớ cache được sử dụng bởi hạt nhân Linux

tôi đã chạy

sudo sync; sudo sysctl -w vm.drop_caches=3; free 

(để giải phóng cả hai đĩa dentry/inode bộ nhớ cache và bộ nhớ cache page) và tôi thấy rằng chỉ có khoảng một nửa số bộ nhớ cache dùng được trả tự do - phần còn lại vẫn còn. Làm thế nào tôi có thể nói những gì đang chiếm phần còn lại của bộ nhớ cache và buộc nó phải được giải phóng?

+0

Bộ nhớ nằm gọn chỉ là bộ nhớ cache bị xóa ngay lập tức khi cần bộ nhớ mới. Nó không phải là có lợi để buộc loại bỏ các vùng bộ nhớ cache. Ứng dụng sẽ luôn là công dân đầu tiên cho bộ nhớ và không phải chiến đấu với bộ nhớ cache cho nó. – ypnos

+1

Tôi gặp sự cố với máy chủ của mình và tôi tin rằng có điều gì đó đang lạm dụng bộ nhớ cache đến mức các ứng dụng được chuyển xuống các trang được hoán đổi và bị đập do thiếu bộ nhớ. Nó có thể là một vấn đề hạt nhân nó có thể không được. Việc dọn dẹp bộ nhớ đệm có thể là một cách tốt để kiểm tra. – Guss

+0

'sysctrl' của bạn phải là 'sysctl' – raittes

Trả lời

17

Bạn sẽ muốn tăng vfs_cache_pressure cũng như đặt swappiness thành 0. Làm điều đó sẽ làm cho hạt nhân khôi phục bộ nhớ cache nhanh hơn, trong khi đưa ra các quy trình bằng hoặc ưu tiên hơn khi quyết định wh được đưa ra. Bạn chỉ muốn thực hiện việc này nếu các quy trình mà bạn quan tâm làm rất ít đĩa I/O. Nếu một quá trình liên kết I/O mạng phải hoán đổi để phục vụ các yêu cầu, đó là một vấn đề và giải pháp thực là đặt nó trên một máy chủ ít cạnh tranh hơn.

Với cài đặt mặc định swappiness, hạt nhân hầu như luôn luôn có lợi cho việc giữ bộ nhớ cache liên quan đến FS trong bộ nhớ thực. Vì vậy, nếu bạn tăng áp lực bộ nhớ cache, hãy chắc chắn cũng điều chỉnh swappiness.

+0

Cảm ơn câu trả lời. Mặc dù nó không phải là những gì tôi đã hy vọng, tôi sẽ chấp nhận nó vì nó bao gồm thông tin tôi không biết và đưa ra một số hướng dẫn để đạt được một mục tiêu. Tôi vẫn muốn biết rõ hơn làm thế nào để tìm ra những gì bộ nhớ cache được sử dụng cho, đặc biệt là khi nó không được làm sạch bởi drop_caches. – Guss

16

Nội dung của /proc/meminfo cho bạn biết hạt nhân sử dụng RAM cho.

Bạn có thể sử dụng /proc/sys/vm/vfs_cache_pressure để buộc hạt nhân khôi phục bộ nhớ được sử dụng cho bộ nhớ cache liên quan đến hệ thống tập tin nhiều hơn hoặc háo hức.

Lưu ý rằng ứng dụng của bạn chỉ có thể hưởng lợi từ việc điều chỉnh thông số này nếu nó có ít hoặc không có đĩa I/O.

+1

Ứng dụng của tôi thực hiện rất ít IO - hầu hết dữ liệu từ một DB từ xa. Tôi hơi mơ hồ trên/proc/meminfo: Tôi thấy về Cached: 1.9GB, SwapCached: 8MB. IIRC, điều đó có nghĩa là Cached bao gồm bộ nhớ đệm trao đổi 8MB, 1.892GB thứ khác (bộ nhớ đệm đĩa và những thứ khác?). Các tệp ánh xạ bộ nhớ được tính ở đâu? – Guss

+0

Tập tin ánh xạ bộ nhớ (nếu ứng dụng ở tất cả tốt) nên có tư vấn và áp lực riêng của chúng, tốt nhất là bởi ứng dụng gọi posix_madvise(). Bạn cũng có thể muốn đọc về cài đặt 'swappiness' của bạn. –

+0

Thực sự là một câu trả lời hay, không phải là câu trả lời cho câu hỏi của tôi :-). Tôi có hiểu chính xác rằng các tệp ánh xạ bộ nhớ được tính vào dấu chân bộ nhớ RES của ứng dụng của chúng không? – Guss

15

Bạn có thể thấy John Nilsson's answer to my Question hữu ích cho thanh lọc bộ nhớ cache để kiểm tra xem có liên quan đến vấn đề của bạn:

sync && echo 1 > /proc/sys/vm/drop_caches

Mặc dù tôi đoán sự khác biệt duy nhất là 1 vs 3

+0

1 chỉ xóa bộ nhớ cache trên đĩa - nó có liên quan đến câu hỏi của bạn. Tôi cũng muốn xóa bộ nhớ cache của trang khi tôi nghĩ rằng một trong các ứng dụng của tôi đang bị rò rỉ bộ nhớ và đập mạnh. – Guss

+2

1 xóa bộ nhớ cache trang, 2 xóa răng giả và inodes, 3 bộ nhớ cache trang rõ ràng, răng giả và inodes – Schildmeijer

Các vấn đề liên quan