Belirli bir programın değiştirilmesini nasıl önleyebilirim?


23

Belirli bir programın (yani ritim kutusu ve bağımlılıklarının) diske değişmesini önlemek mümkün müdür?

Soruyorum çünkü Chromium çok fazla bellek barındırdığında bir müzik çaların ses çıkarmasıyla ilgili bir sorunum var. Bu sorunu çözmek için bir yol var mı? Bu artık Windows'da bir sorun değil, bu yüzden muhtemelen bir yol var.


Tomboy da aynı sorunu yaşıyor . Bazı insanların GNote'a geçmesinin nedenlerinden biri de budur .
Cristian Ciupitu

1
Bence hıçkırık problemi mutlaka değişmeden kaynaklanmıyor. Program bir şey oynuyorsa, Linux bunu fark etmeli ve değiştirmemelidir. Çok işe yaramayan programlar ilk değiştirilen programlardır. Çalıştırmak mı psyoksa toprhytmbox gerçekten denetleyerek takas olup olmadığını görmek için RSS/ RESalan? Sorununuzun çoğunlukla yanlış zamanlamadan kaynaklandığını düşünüyorum. reniceRhytmbox işlemini denemeli veya bazı ayarlarını, örneğin ses arabelleğinin boyutunu değiştirmelisiniz.
Cristian Ciupitu

1
Teşekkürler! Bir programın başlangıçtaki güzel değerini ayarlamanın bir yolu var mı? / etc / nicetab falan? :)
Alexei Averchenko

Yanıtlar:


10

Bence hıçkırık problemi mutlaka değişmeden kaynaklanmıyor. Bir program bir şey oynuyorsa, Linux bunu fark etmeli ve değiştirmemelidir. Çok işe yaramayan programlar ilk değiştirilen programlardır. Ps / topRSS / RESalanına bakarak programın gerçekten değişip değişmediğini kontrol edebilirsiniz . yerleşik ayar boyutu, bir görevin kullandığı değiştirilmemiş fiziksel bellek (kiloBytes cinsinden).RSS

Sorununuzun büyük olasılıkla yanlış CPU ve I / O zamanlaması ve yüksek sistem yüklerine duyarlı hale getiren Rhythmbox'ın biraz verimsizliğinden kaynaklandığını düşünüyorum. CPU önceliği nice ve renice komutları ile değiştirilebilir . I / O önceliği ionice komutu ile değiştirilebilir . Yalnızca süper kullanıcı yüksek öncelikleri kullanabilir. Ayrıca Linux çekirdeğinin çeşitli düşük gecikmeli yamalar içeren masaüstü sistemlerinin yanıt hızını artırmaya çalıştığını da bilmelisiniz. Bunlardan biri, Linus'u bile etkileyen Mike Galbraith tarafından yazılmış ~ 200 satırlık bir yama . Bu yamanın alternatifi Lennart Poettering'in grup hilesi Bence bu Fedora 15'te varsayılan olacak.

Her neyse, bu yamalar olmadan iki seçenek vardır: programı yüksek bir öncelikle başlatın veya daha sonra değiştirin. İlk seçenek için Rhythmbox'ın etrafında bir sarmalayıcı komut dosyası kullanabilirsiniz:

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

Kök olarak çalıştırmanız gerekecek. Bunu başlatmak için root olarak giriş yapmak istemiyorsanız, ya suda tuşlarını kullanabilirsiniz sudo.

Daha sonra önceliği değiştirmeye gelince, değiştirmek için kök olarak oturum açmak için çok tembelseniz, her 5 dakikada bir çalışan ve rhythmboxişlemin önceliğini ayarlayan bir cron işi kullanmayı deneyebilirsiniz , ancak bunu yapmanızı önermem:

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

5

Kısa cevap: Yapamazsınız ve yapmamalısınız.

Uzun zaman önce yürütülebilir dosyalar +t, çekirdeğe takas yapmamasını söyleyen yapışkan biti onurlandırdı , ancak bugün göz ardı edildi.

Çekirdek değiştirmesi gerektiğine karar verirse, bunun geçerli bir nedeni vardır. Linux bellek kullanımında çok agresiftir, çünkü boştaki RAM boşa giden bir kaynaktır.

Gerçekten takas yapmak istemiyorsanız, daha fazla RAM alın veya sadece # swapoff -a(tavsiye edilmezse, zaten sorunlarınız varsa sisteminizi kullanılamaz hale getirebilirsiniz).

Shouldn'tbazı uygulama geliştirirken gider ve hiç takas istemiyorum. Stackoverflow'daki bu gönderiye bir göz atın .


2
Yaklaşık 100 MiB ayırmanın sistemimi öldüreceğini sanmıyorum. Belki de özel sorunumu çözmenin başka bir yolu var (düzenlenmiş soruya bakın)?
Alexei Averchenko

1
Bir işlemi diğer süreçlere göre yüksek bir yanıt verme düzeyinde tutmak istiyorsanız, cevap güzeldir (bunu yapmak için kök olmalısınız). Ellerinizi kirletmek istemiyorsanız bellek disk belleği ile uğraşmak kolay değildir (koda dokunmak, yeniden derlemek, hatta LD_PRELOAD işlemi kandırmak ve belleği ayırmak için kullanılan işlevi değiştirmek için tekrar - tavsiye edilmez) . Tavsiye? süreci yeniden adlandırın, daha fazla RAM alın veya sekmeleri açmayı durdurun;)
Torian

5
"Çekirdek değiş tokuş etmek zorunda olduğuna karar verirse, bunun geçerli bir nedeni var" doğru değil. Bugün 1,3G boş belleğim vardı. Linux çekirdeği httpd işlemlerimi değiştirmeye koydu (370M).
bluszcz

@bluszcz (iyi, yorumun ne kadar eski olduğu göz önüne alındığında bunu okuyanlar): Bunun nedeni, httpd'niz tarafından sunulan dosyalar için disk önbelleğinin httpd'nizin nadiren kullanılan kısımlarından daha önemli olduğuna karar vermesi olabilir - diğer yanıtlara bakın "swappiness" den söz ediyor.
Jan Schejbal

@JanSchejbal thats çünkü linux, en azından biri söylemeden, hangi işlemlerin önemli olup olmadığını bilmiyor. Bir sunucu ortamında sisteme hangi işlemlerin önemli, hangilerinin önemli olmadığını söyleyebilmelisiniz. "Ben başka şeyler umurumda değil, ama bu süreçler bu sunucunun çalışması için en önemli"
Rahly


3

Bunu yapmanın birkaç yolu vardır. Deneyin denemek için "diyor" Linux takas ile daha az çalışır (genellikle):

echo 10 > /proc/sys/vm/swappiness

Gönderen: https://www.kernel.org/doc/Documentation/sysctl/vm.txt

swappiness

Bu kontrol, çekirdeğin bellek sayfalarını ne kadar agresif hale getireceğini tanımlamak için kullanılır. Yüksek değerler agresifliği artırır, düşük değerler takas miktarını azaltır.

Varsayılan değer 60'tır.

Diğer seçenek, cgroups çekirdek yöneticisini kullanmaktır, bu işlem başına özeldir, ancak yapmanız gereken bazı "işleriniz" olacaktır: Yanıtlanan: /unix/10214/per-process-swapiness-for -linux # 10227


1
bu, işleme özgü değil küresel olarak değişmeyi etkiler.
Lorenzo Von Matterhorn

1
evet, "(genellikle)" üzerine yazdığımı fark edebilirsiniz. İşlem başına seçenek, cgroups kullanan diğer cevaba bağlantıdır.
ceinmart

O zaman bu bir yardım değil, değil mi?
Ken Sharp

Ken Sharp: Bu cevap, soruna en iyi çözüm gibi görünen (en azından ilk bakışta) doğrudan bağlantı veren tek cevaptır. Yani ... söylediklerinin tam tersi.
phil

@phils Bunun nasıl çalıştığını anlamıyorsunuz.
Ken Sharp

0

mlockall()Sistem aramasını kullanabilirsiniz . mlockall () bellek işlemini yerleşik olmaya zorlar (= takas yok, fazla taahhüt yok, vb ...). AFAIK, bunu yapmak için bir kabuk komutu yoktur, ancak bir tane oluşturmak kolaydır. Şöyle görünecektir:

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

Not, aramak için kök olmanız gerekir mlockall().

Ancak, diğer cevapta söylendiği gibi, bunun gerçekten istediğiniz şey olduğunu sanmıyorum.


1
Execvp hangi mlockall geri almak yürütmek için bir ön uç olduğu gibi kod hiç çalışmaz. Mlock kılavuz sayfasındaki Notlar bölümüne bakın.
Johannes Matokic
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.