Làm thế nào để ngăn chặn một chương trình cụ thể từ hoán đổi?


23

Có thể ngăn chặn một chương trình cụ thể (ví dụ như nhịp điệu và các phụ thuộc của nó) không bao giờ hoán đổi vào đĩa?

Tôi đang hỏi vì tôi gặp vấn đề khi trình phát nhạc bị trục trặc mỗi khi Chromium chiếm quá nhiều bộ nhớ. Có cách nào để làm việc này? Đây không còn là vấn đề trong Windows nữa nên có lẽ có một cách.


Tomboy có cùng một vấn đề. Đó là một trong những lý do khiến một số người đã chuyển sang GNote .
Cristian Ciupitu

1
Tôi nghĩ rằng vấn đề nấc cục không nhất thiết là do hoán đổi. Nếu chương trình đang phát một cái gì đó, Linux sẽ chú ý điều này và không trao đổi nó. Các chương trình không làm được gì nhiều là những chương trình đầu tiên bị hoán đổi. Bạn đã chạy pshoặc topđể xem rhytmbox có thực sự hoán đổi bằng cách kiểm tra RSS/ REStrường không? Tôi nghĩ rằng vấn đề của bạn chủ yếu là do lập kế hoạch không đúng. Bạn nên thử renicexử lý rhytmbox hoặc thay đổi một số cài đặt của nó, ví dụ như kích thước của bộ đệm âm thanh.
Cristian Ciupitu

1
Cảm ơn! Có cách nào để thiết lập giá trị tốt đẹp ban đầu của một chương trình không? / etc / nicetab hay cái gì? :)
Alexei Averchenko

Câu trả lời:


10

Tôi nghĩ rằng vấn đề nấc cục không nhất thiết là do hoán đổi. Nếu một chương trình đang chơi một cái gì đó, Linux nên chú ý điều này và không trao đổi nó. Các chương trình không làm được gì nhiều là những chương trình đầu tiên bị hoán đổi. Bạn có thể kiểm tra xem chương trình có thực sự bị tráo đổi hay không bằng cách xem trường RSS/ REStừ ps hoặc top . RSSlà kích thước cài đặt thường trú, bộ nhớ vật lý không hoán đổi mà tác vụ đang sử dụng (tính bằng kiloBytes).

Tôi nghĩ rằng vấn đề của bạn rất có thể là do lập lịch CPU và I / O không phù hợp và một chút không hiệu quả của Rhybeatbox khiến nó nhạy cảm với tải hệ thống cao. Các ưu tiên CPU có thể được thay đổi với các lệnh thoải máirenice . Ưu tiên I / O có thể được thay đổi bằng lệnh ionice . Chỉ có siêu người dùng có thể sử dụng mức độ ưu tiên cao. Bạn cũng nên biết rằng các nhân nhân Linux đang cố gắng cải thiện khả năng phản hồi của các hệ thống máy tính để bàn với các bản vá có độ trễ thấp khác nhau, vì vậy bạn có thể cân nhắc sử dụng chúng. Một trong số đó là bản vá ~ 200 dòng được viết bởi Mike Galbraith , thứ đã gây ấn tượng ngay cả Linus. Thay thế cho bản vá này là thủ thuật nhóm của Lennart Poettering mà tôi nghĩ sẽ là mặc định trong Fedora 15.

Dù sao, không có các bản vá đó, có hai lựa chọn: bắt đầu chương trình với mức độ ưu tiên cao hoặc thay đổi nó sau đó. Đối với tùy chọn đầu tiên, bạn có thể sử dụng tập lệnh bao quanh Rhybeatbox:

#!/bin/sh
# Run Rhytmbox with high CPU and I/O priorities
nice -n -10 ionice -c 1 -n 1 su -l -c rhythmbox alexei

Bạn sẽ cần phải chạy nó như root. Nếu bạn không muốn đăng nhập bằng root chỉ để bắt đầu, bạn có thể sử dụng suhoặc sudo.

Đối với việc thay đổi mức độ ưu tiên sau đó, nếu bạn quá lười để đăng nhập bằng root để thay đổi nó, bạn có thể thử sử dụng một công việc định kỳ chạy cứ sau 5 phút và đặt mức độ ưu tiên của rhythmboxquy trình, nhưng tôi không khuyên bạn nên làm điều này:

#!/bin/sh
renice -n -10 -p `pidof rhythmbox`
ionice -c 1 -n 1 -p `pidof rhythmbox`

5

Câu trả lời ngắn: Bạn không thể, và không nên.

Một thời gian dài trước đây các tập tin thực thi đã tôn vinh bit dính +tsẽ bảo kernel không được trao đổi, nhưng hôm nay nó bị bỏ qua.

Nếu kernel quyết định nó phải trao đổi, nó chắc chắn có lý do hợp lệ. Linux rất tích cực trong việc sử dụng bộ nhớ, vì RAM không hoạt động, là một tài nguyên lãng phí.

Nếu bạn thực sự không muốn trao đổi, nhận thêm RAM hoặc chỉ # swapoff -a(không được đề xuất, có thể biến hệ thống của bạn không sử dụng được nếu bạn gặp vấn đề).

Shouldn'tđi khi bạn đang phát triển một số ứng dụng và không muốn nó trao đổi. Hãy xem bài viết này trên stackoverflow .


2
Tôi không nghĩ rằng việc đặt trước khoảng 100 MiB sẽ giết chết hệ thống của tôi. Có lẽ có một cách khác để giải quyết vấn đề cụ thể của tôi (xem câu hỏi được chỉnh sửa)?
Alexei Averchenko

1
Nếu bạn có ý định giữ một quy trình ở mức độ đáp ứng cao so với các quy trình khác, câu trả lời là tốt (bạn phải root để thực hiện việc này). Loay hoay với phân trang bộ nhớ là không dễ nếu bạn không muốn bị bẩn tay (chạm vào mã, biên dịch lại hoặc thậm chí LD_PRELOAD một thư viện tùy chỉnh để đánh lừa quá trình và điều chỉnh chức năng được sử dụng để cấp phát bộ nhớ - một lần nữa, không khuyến nghị) . Lời khuyên ? gia hạn quy trình, nhận thêm RAM hoặc dừng mở tab;)
Torian

5
"Nếu hạt nhân quyết định nó phải trao đổi, nó chắc chắn có lý do hợp lệ" điều đó không đúng. Hôm nay tôi có bộ nhớ trống 1,3G. Nhân Linux đưa các tiến trình httpd của tôi vào trao đổi (370M).
bluszcz

@bluszcz (tốt, những người khác đọc nhận xét này bao nhiêu tuổi): Đó có thể là do nó quyết định rằng bộ đệm đĩa cho các tệp được cung cấp bởi httpd của bạn quan trọng hơn các phần hiếm khi được sử dụng trong chính httpd của bạn - xem các câu trả lời khác đề cập đến "swappiness".
Jan Schejbal

@JanSchejbal đó là vì linux, ít nhất là không có ai nói với nó, không biết quá trình nào quan trọng hay không. Trong môi trường máy chủ, bạn sẽ có thể cho hệ thống biết quy trình nào quan trọng và quy trình nào không. "Tôi không quan tâm đến những thứ khác, nhưng những quy trình này là quan trọng nhất đối với hoạt động của máy chủ này"
Rahly


3

Có một số cách để làm điều đó. Bạn có thể thử dùng "nói" để Linux hoạt động ít hơn với trao đổi (nói chung):

echo 10 > /proc/sys/vm/swappiness

Từ: https://www.kernel.org/doc/Documentation/sysctl/vm.txt

trao đổi

Điều khiển này được sử dụng để xác định mức độ tích cực của kernel sẽ trao đổi các trang bộ nhớ. Giá trị cao hơn sẽ làm tăng tính áp lực, giá trị thấp hơn làm giảm lượng trao đổi.

Giá trị mặc định là 60.

Tùy chọn khác là sử dụng trình quản lý nhân cgroups, đây là quy trình cụ thể theo từng quy trình nhưng bạn sẽ có một số "công việc" phải làm: Đã trả lời tại đây: /unix/10214/per- Process-swiness-for -linux # 10227


1
điều này ảnh hưởng đến swappiness trên toàn cầu, không cụ thể theo quy trình.
Lorenzo Von Matterhorn

1
vâng, bạn có thể nhận thấy rằng trên "(nói chung)" tôi đã viết. Tùy chọn cho mỗi quá trình là liên kết đến câu trả lời khác, sử dụng các nhóm.
ceinmart

Vậy thì không có ích gì phải không?
Ken Sharp

Ken Sharp: Câu trả lời này là người duy nhất liên kết trực tiếp đến những gì dường như (ít nhất là ở cái nhìn đầu tiên) giống như giải pháp tốt nhất cho vấn đề. Vì vậy, ... khá nhiều điều trái ngược với những gì bạn nói.
phils

@phils Bạn không hiểu làm thế nào điều này hoạt động.
Ken Sharp

0

Bạn có thể sử dụng mlockall()tòa nhà chọc trời. mlockall () buộc quá trình bộ nhớ trở thành cư dân (= không trao đổi, không thừa, v.v ...). AFAIK, không có lệnh shell để làm điều đó, nhưng thật dễ dàng để tạo một lệnh. Nó sẽ trông như:

if (mlockall(MCL_FUTURE | MCL_CURRENT))
     perror("mlockall");
execvp(argv[0], argv);

Lưu ý, bạn cần phải root để gọi mlockall().

Tuy nhiên, như đã nói trong câu trả lời khác, tôi không nghĩ đó thực sự là những gì bạn muốn.


1
Mã này hoàn toàn không hoạt động vì execvp là một frontend để thực thi mà hoàn tác mlockall. Xem phần Ghi chú trên trang mlock man.
Julian Matokic
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.