วิธีการป้องกันไม่ให้โปรแกรมเฉพาะเปลี่ยนหรือไม่


23

เป็นไปได้หรือไม่ที่จะป้องกันโปรแกรมเฉพาะ (เช่น rhythmbox และการพึ่งพา) จากการสลับไปยังดิสก์?

ฉันถามเพราะฉันมีปัญหาเมื่อเครื่องเล่นเพลงสะดุดเมื่อใดก็ตามที่ Chromium hogs มีหน่วยความจำมากเกินไป มีวิธีแก้ไขไหม นี่ไม่ใช่ปัญหาใน Windows อีกต่อไปดังนั้นจึงมีวิธี


ทอมบอยมีปัญหาเดียวกัน มันเป็นหนึ่งในเหตุผลที่บางคนได้เปลี่ยนไปGNote
Cristian Ciupitu

1
ฉันคิดว่าปัญหาอาการสะอึกไม่จำเป็นต้องเกิดจากการแลกเปลี่ยน หากโปรแกรมกำลังเล่นอะไรอยู่ Linux ควรสังเกตสิ่งนี้และไม่สลับมัน โปรแกรมที่ไม่ได้ทำมากเป็นโปรแกรมแรกที่เปลี่ยน คุณเรียกใช้psหรือไม่topเพื่อดูว่า rhytmbox สลับกันโดยการตรวจสอบฟิลด์RSS/ RESหรือไม่? ฉันคิดว่าปัญหาของคุณส่วนใหญ่เกิดจากการตั้งเวลาที่ไม่เหมาะสม คุณควรลองreniceใช้กระบวนการ rhytmbox หรือเปลี่ยนการตั้งค่าบางอย่างเช่นขนาดของบัฟเฟอร์เสียง
Cristian Ciupitu

1
ขอบคุณ! มีวิธีการตั้งค่าเริ่มต้นที่ดีของโปรแกรมหรือไม่? / etc / nicetab หรืออะไร? :)
Alexei Averchenko

คำตอบ:


10

ฉันคิดว่าปัญหาอาการสะอึกไม่จำเป็นต้องเกิดจากการแลกเปลี่ยน หากโปรแกรมกำลังเล่นอะไรอยู่ Linux ควรสังเกตสิ่งนี้และไม่สลับมัน โปรแกรมที่ไม่ได้ทำมากเป็นโปรแกรมแรกที่เปลี่ยน คุณสามารถตรวจสอบว่าโปรแกรมที่เป็นจริงที่ได้รับการเปลี่ยนโดยดูที่RSS/ RESข้อมูลจากPSหรือด้านบน RSSเป็นขนาดชุดที่อยู่อาศัยหน่วยความจำฟิสิคัลที่ไม่ได้สลับที่งานกำลังใช้ (เป็นกิโลไบต์)

ฉันคิดว่าปัญหาของคุณอาจเกิดจากการกำหนดเวลา CPU และ I / O ที่ไม่เหมาะสมและ Rhythmbox ขาดประสิทธิภาพเล็กน้อยซึ่งทำให้ไวต่อการโหลดระบบสูง จัดลำดับความสำคัญของ CPU สามารถเปลี่ยนแปลงได้ด้วยคำสั่งที่ดีและrenice ลำดับความสำคัญ I / O สามารถเปลี่ยนแปลงได้ด้วยคำสั่งionice เฉพาะผู้ใช้ขั้นสูงเท่านั้นที่สามารถใช้ลำดับความสำคัญสูงได้ คุณควรทราบด้วยว่าพวกเคอร์เนล Linux พยายามปรับปรุงการตอบสนองของระบบเดสก์ท็อปด้วยแพตช์ความหน่วงต่ำต่างๆดังนั้นคุณอาจลองใช้มัน หนึ่งในนั้นคือแพทช์ ~ 200 บรรทัดที่เขียนโดย Mike Galbraithซึ่งสร้างความประทับใจแม้กระทั่ง Linus ทางเลือกสำหรับแพทช์นี้คือเล่ห์เหลี่ยมของกลุ่มผู้ใช้ Lennart Poettering ซึ่งฉันคิดว่าจะเป็นค่าเริ่มต้นใน Fedora 15

อย่างไรก็ตามไม่มีตัวเลือกเหล่านี้มีสองตัวเลือก: เริ่มโปรแกรมที่มีลำดับความสำคัญสูงหรือเปลี่ยนแปลงในภายหลัง สำหรับตัวเลือกแรกคุณสามารถใช้สคริปต์ตัวหุ้มรอบ Rhythmbox:

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

คุณจะต้องเรียกใช้เป็นรูท หากคุณไม่ต้องการที่จะเข้าสู่ระบบเป็นรากเพียงแค่การเริ่มต้นนี้คุณสามารถใช้อย่างใดอย่างหนึ่งหรือsusudo

สำหรับการเปลี่ยนลำดับความสำคัญหลังจากนั้นหากคุณขี้เกียจเกินกว่าจะเข้าสู่ระบบในฐานะ root เพื่อเปลี่ยนคุณสามารถลองใช้งาน cron ที่ทำงานทุก 5 นาทีและกำหนดลำดับความสำคัญของrhythmboxกระบวนการ แต่ฉันไม่แนะนำให้ทำเช่นนี้:

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

5

คำตอบสั้น ๆ : คุณทำไม่ได้และไม่ควรทำ

เมื่อนานมาแล้วไฟล์ที่สามารถใช้งานได้ให้เกียรติบิต+tที่จะบอกเคอร์เนลว่าจะไม่สลับ แต่วันนี้มันจะถูกละเว้น

หากเคอร์เนลตัดสินใจว่าจะต้องสลับก็แน่ใจว่ามีเหตุผลที่ถูกต้อง Linux มีความก้าวร้าวมากในการใช้งานหน่วยความจำเนื่องจาก RAM ที่ไม่ได้ใช้งานเป็นทรัพยากรที่สูญเปล่า

หากคุณไม่ต้องการสลับรับ RAM มากขึ้นหรือเพียงแค่# swapoff -a(ไม่แนะนำให้ใช้อาจทำให้ระบบของคุณใช้ไม่ได้หากคุณมีปัญหา)

Shouldn'tดำเนินไปเมื่อคุณพัฒนาแอพบางตัวและไม่ต้องการให้มันแลกเปลี่ยนเลย ลองดูที่โพสต์นี้ใน StackOverflow


2
ฉันไม่คิดว่าการจองประมาณ 100 MiB จะฆ่าระบบของฉัน อาจมีวิธีอื่นในการแก้ปัญหาเฉพาะของฉัน (ดูคำถามที่แก้ไข)
Alexei Averchenko

1
หากคุณต้องการรักษากระบวนการให้อยู่ในระดับสูงของการตอบสนองเหนือกระบวนการอื่น ๆ คำตอบก็ดี (คุณต้องรูทเพื่อทำสิ่งนี้) การยุ่งกับการสลับหน้าหน่วยความจำนั้นไม่ใช่เรื่องง่ายหากคุณไม่ต้องการทำให้มือสกปรก (แตะที่รหัส, คอมไพล์ใหม่หรือแม้แต่ LD_PRELOAD การสร้างไลบรารี่ที่กำหนดเองเพื่อหลอกล่อกระบวนการและปรับฟังก์ชั่นที่ใช้ในการจัดสรรหน่วยความจำ . คำแนะนำ? สละกระบวนการรับ RAM เพิ่มเติมหรือหยุดการเปิดแท็บ;)
Torian

5
"หากเคอร์เนลตัดสินใจว่าจะต้องสลับก็แน่ใจว่ามีเหตุผลที่ถูกต้อง" ที่ไม่เป็นความจริง วันนี้ฉันมีหน่วยความจำฟรี 1,3G เคอร์เนล Linux นำกระบวนการ httpd ของฉันไปใช้ในการแลกเปลี่ยน (370M)
bluszcz

@bluszcz (คนอื่น ๆ ที่อ่านสิ่งนี้ให้ความเห็นนั้นอายุเท่าไร): นั่นอาจเป็นเพราะมันตัดสินใจว่าแคชดิสก์สำหรับไฟล์ที่เสิร์ฟโดย httpd ของคุณมีความสำคัญมากกว่าส่วนที่ไม่ค่อยได้ใช้ของ httpd ของคุณ - ดูคำตอบอื่น ๆ พูดถึง "swappiness"
Jan Schejbal

@JanSchejbal นั่นเพราะ linux อย่างน้อยก็ไม่มีใครบอกไม่ทราบว่ากระบวนการใดมีความสำคัญหรือไม่ ในสภาพแวดล้อมเซิร์ฟเวอร์คุณควรจะสามารถบอกระบบว่ากระบวนการใดมีความสำคัญและไม่ได้ "ฉันไม่สนใจสิ่งอื่น ๆ แต่กระบวนการเหล่านี้สำคัญที่สุดสำหรับการทำงานของเซิร์ฟเวอร์นี้"
Rahly


3

มีหลายวิธีที่จะทำเช่นนั้น คุณสามารถลองได้คือ "บอกว่า" เพื่อให้ Linux ทำงานได้น้อยลงด้วยการสลับ (โดยทั่วไป):

echo 10 > /proc/sys/vm/swappiness

จาก: https://www.kernel.org/doc/Documentation/sysctl/vm.txt

swappiness

การควบคุมนี้ใช้เพื่อกำหนดว่าเคอร์เนลจะสลับหน้าหน่วยความจำอย่างไร ค่าที่สูงกว่าจะเพิ่มความก้าวร้าวค่าที่ต่ำกว่าจะลดจำนวนของการสลับ

ค่าเริ่มต้นคือ 60

ตัวเลือกอื่นคือใช้ตัวจัดการเคอร์เนล cgroups ซึ่งเป็นกระบวนการเฉพาะ แต่คุณจะมี "งาน" ที่ต้องทำ: ตอบแล้วที่นี่: /unix/10214/per-process-swapiness- สำหรับ ลินุกซ์ # 10227


1
สิ่งนี้มีผลต่อความรวดเร็วทั่วโลกไม่ใช่เฉพาะกระบวนการ
Lorenzo Von Matterhorn

1
ใช่คุณสามารถสังเกตเห็นว่าใน "(โดยทั่วไป)" ฉันเขียน ตัวเลือกที่จะเป็นต่อกระบวนการคือการเชื่อมโยงไปยังคำตอบอื่น ๆ โดยใช้ cgroups
ceinmart

ถ้าอย่างนั้นก็ช่วยไม่ได้ใช่ไหม
Ken Sharp

เคนชาร์ป: คำตอบนี้เป็นเพียงคำตอบเดียวที่เชื่อมโยงโดยตรงกับสิ่งที่ดูเหมือน (อย่างน้อยก็ในตอนแรก) เช่นวิธีแก้ปัญหาที่ดีที่สุด ดังนั้น ... ตรงกันข้ามกับที่คุณพูดมาก
phils

@phils คุณไม่เข้าใจวิธีการทำงาน
Ken Sharp

0

คุณสามารถใช้mlockall()syscall mlockall () บังคับให้กระบวนการหน่วยความจำมีถิ่นที่อยู่ (= ไม่มีการสลับไม่มีการวางทับมากเกินไป ฯลฯ ... ) AFAIK ไม่มีคำสั่งเชลล์ที่จะทำ แต่สร้างได้ง่าย มันจะมีลักษณะ:

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

mlockall()หมายเหตุคุณจะต้องมีรากที่จะโทร

อย่างไรก็ตามอย่างที่กล่าวไว้ในคำตอบอื่น ๆ ฉันไม่คิดว่ามันเป็นสิ่งที่คุณต้องการจริงๆ


1
รหัสจะไม่ทำงานเลยเพราะ execvp เป็นส่วนหน้าในการเอ็กซีคิ้วท์ที่เลิกทำการล็อก mlockall ดูส่วนหมายเหตุใน mlock man-page
โยฮันเนสมาโทคิค
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.