คอมพิวเตอร์ค้างใน RAM เกือบเต็มอาจเป็นปัญหาแคชดิสก์


74

ปัญหาที่เกิดขึ้นผมคิดว่าจะค่อนข้างคล้ายกับนี้ด้าย

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

ดิสก์หมุนได้อย่างดุเดือดและบางครั้งหลังจากที่รอนาน 10-30 นาทีมันจะทำน้ำแข็งให้ละลายและบางครั้งก็ไม่ใช่ (หรือฉันหมดความอดทน) บางครั้งถ้าฉันดำเนินการอย่างรวดเร็วฉันสามารถจัดการเปิดคอนโซลอย่างช้าๆและฆ่าแอปพลิเคชั่นการกิน ram เช่นเบราว์เซอร์และระบบจะเปิดแทบจะทันที

เนื่องจากปัญหานี้ฉันแทบไม่เคยเห็นอะไรเลยในการแลกเปลี่ยนบางครั้งมีเพียงไม่กี่ MB ที่นั่นและหลังจากนั้นไม่นานปัญหานี้ก็ปรากฏขึ้น การเดาที่ไม่ได้รับการศึกษาของฉันคงเป็นเพราะมันเชื่อมต่อกับดิสก์แคชที่โลภมากเกินไปหรือการจัดการหน่วยความจำที่ผ่อนปรนเกินไปดังนั้นเมื่อจำเป็นต้องใช้หน่วยความจำมันจะไม่ได้รับการปลดปล่อยอย่างรวดเร็วเพียงพอและทำให้ระบบหยุดชะงัก

ปัญหาสามารถเกิดขึ้นได้อย่างรวดเร็วหากทำงานกับไฟล์ lagrge (500MB +) ซึ่งโหลดในแคชดิสก์และหลังจากนั้นระบบไม่สามารถโหลดได้เร็วพอ

ความช่วยเหลือหรือแนวคิดใด ๆ จะได้รับการชื่นชมอย่างมาก

สำหรับตอนนี้ฉันต้องมีชีวิตอยู่ด้วยความกลัวอย่างต่อเนื่องเมื่อทำอะไรบางอย่างที่คอมพิวเตอร์สามารถหยุดได้และฉันต้องรีสตาร์ทมันถ้ามันหมดหน่วยความจำจริง ๆ ฉันอยากจะฆ่าแอพพลิเคชั่นของผู้ใช้บางส่วนเช่น broser ( โดยเฉพาะอย่างยิ่งถ้าฉันสามารถทำเครื่องหมายอย่างใดที่จะฆ่าก่อน)

ถึงแม้ว่าภารกิจคือทำไมการไม่แลกเปลี่ยนช่วยฉันในสถานการณ์นี้

UPDATE: มันไม่ได้หยุดซักพัก แต่ตอนนี้ฉันมีเหตุการณ์หลายครั้งอีกครั้ง ตอนนี้ฉันกำลังตรวจสอบ ram บนหน้าจอของฉันตลอดเวลาและเมื่อการแฮงค์เกิดขึ้นก็ยังแสดงให้เห็นฟรี ~ 30% (อาจใช้แคชดิสก์) อาการเพิ่มเติม: หากในขณะที่ฉันกำลังดูวิดีโอ (เครื่องเล่น VLC) เสียงจะหยุดก่อนหลังจากนั้นไม่กี่วินาทีภาพก็จะหยุด ในขณะที่เสียงหยุดลงฉันยังคงสามารถควบคุมพีซีได้ แต่เมื่อภาพหยุดฉันไม่สามารถขยับเมาส์ได้อีกต่อไปดังนั้นฉันจึงเริ่มต้นใหม่หลังจากรอสักครู่ Btw สิ่งนี้ไม่ได้เกิดขึ้นเมื่อฉันเริ่มดูวิดีโอ แต่บางครั้งใน (20 นาที) และฉันไม่ได้ทำอะไรอย่างแข็งขันในเวลานั้นแม้ว่าเบราว์เซอร์และ oowrite จะเปิดบนหน้าจอที่สองตลอดเวลา โดยทั่วไปบางสิ่งบางอย่างก็ตัดสินใจที่จะเกิดขึ้นที่จุดหนึ่งและแขวนระบบ

ตามคำขอในความคิดเห็นที่ฉันวิ่ง dmesg ทันทีหลังจากที่แขวน ฉันไม่ได้สังเกตเห็นสิ่งแปลก ๆ แต่ไม่รู้ว่าจะมองอะไรดังนั้นนี่คือ: https://docs.google.com/document/d/1iQih0Ee2DwsGd3VuQZu0bPbg0JGjSOCRZhu0B05CMYs/edit?hl=th


11
สิ่งนี้ต้องการความสนใจมากขึ้น ฉันรู้ว่ามีข้อบกพร่องยื่นหลายปี
n3rd

1
@ n3rd: นี่คือข้อผิดพลาด
Dan Dascalescu

@ Krišjānis Nesenbergs: โปรดแก้ไขให้ฉันด้วยหากฉันทำสำเนาผิดวางไฟล์ที่มีความยาวและทำให้แฮงค์
Rick2047

ขอขอบคุณที่ถามคำถามนี้และค้นหาวิธีแก้ไข โปรดเพิ่มวันที่ในการอัพเดทมิฉะนั้นจะไม่ชัดเจนว่าอะไรทำงานและสิ่งที่ไม่ทำงาน ฉันมีปัญหาเดียวกันฉันมักจะตรวจสอบระดับหน่วยความจำและฉันมี 16GB, วางแผนที่จะมี 32GB เพื่อดูว่าฉันสามารถแก้ไขได้ด้วยวิธีการที่ ...
Beto Aveiga

คำตอบ:


63

ในการแก้ไขปัญหานี้ฉันพบว่าคุณต้องตั้งค่าต่อไปนี้เป็นประมาณ 5% -6% ของ RAM จริงทั้งหมดของคุณหารด้วยจำนวนแกนประมวลผลในคอมพิวเตอร์:

sysctl -w vm.min_free_kbytes=65536

โปรดจำไว้ว่านี่เป็นการตั้งค่าต่อคอร์ดังนั้นถ้าฉันมี RAM 2GB และสองแกนดังนั้นฉันคำนวณ 6% ของเพียง 1 GB และเพิ่มพิเศษเพียงเล็กน้อยเพื่อความปลอดภัย

สิ่งนี้บังคับให้คอมพิวเตอร์พยายามรักษาจำนวน RAM ให้ว่างและในการทำเช่นนั้นจะจำกัดความสามารถในการแคชไฟล์ดิสก์ แน่นอนว่ามันยังพยายามแคชพวกมันและสลับมันทันทีดังนั้นคุณควร จำกัด การสลับของคุณด้วย:

sysctl -w vm.swappiness=5

(100 = สลับบ่อยที่สุดเท่าที่เป็นไปได้ 0 = สลับเฉพาะความจำเป็นทั้งหมด)

ผลคือลินุกซ์ไม่สุ่มตัดสินใจโหลดไฟล์ภาพยนตร์ทั้งหมดประมาณ 1GB ในหน่วยความจำขณะดูและฆ่าเครื่องด้วยการทำเช่นนั้น

ขณะนี้มีพื้นที่สงวนเพียงพอที่จะหลีกเลี่ยงความอดอยากในหน่วยความจำซึ่งเป็นปัญหาที่เกิดขึ้นบ่อยครั้ง (โดยที่ไม่ต้องมีการค้างก่อนหน้า)

หลังจากการทดสอบในแต่ละวันหมดไปบางครั้งก็มีการชะลอตัวเล็กน้อยเพราะบางสิ่งถูกแคชบ่อยขึ้น แต่ฉันสามารถอยู่กับมันได้ถ้าฉันไม่ต้องรีสตาร์ทคอมพิวเตอร์ทุก ๆ สองสามชั่วโมง

บทเรียนที่นี่คือ - การจัดการหน่วยความจำเริ่มต้นเป็นเพียงหนึ่งในกรณีการใช้งานและไม่ใช่วิธีที่ดีที่สุดแม้ว่าบางคนพยายามที่จะแนะนำเป็นอย่างอื่น - ความบันเทิงในบ้านอูบุนตูควรกำหนดค่าแตกต่างจากเซิร์ฟเวอร์


คุณอาจต้องการตั้งค่าเหล่านี้อย่างถาวรโดยการเพิ่มลง/etc/sysctl.confในสิ่งนี้

vm.swappiness=5
vm.min_free_kbytes=65536

ดีหาพยายามที่จะรายงานข้อผิดพลาดเกี่ยวกับเรื่องนี้เพื่อให้มีความตระหนักมากขึ้นของปัญหาและหวังว่าคนที่จะมาขึ้นกับการแก้ปัญหาเพื่อไม่ให้สุ่มโหลดหนังทั้งหมด,
Oxwivi

ขอบคุณรายละเอียดดีมากและอธิบายถึงปัญหาของฉัน ชื่นชมมาก!
odedbd

1
ฉันลองเกือบทุกอย่างและมีเพียงคำแนะนำของคุณที่ปรับปรุงสิ่งต่างๆ ขอบคุณ
vitalii

1
หากฉันทำงานโดยไม่มีพาร์ติชั่นการแลกเปลี่ยนฉันควรใช้ปริมาณที่มากกว่า 5-6% หรือไม่ และการตั้งค่าvm.swappinessจะไม่ทำอะไรเลยในกรณีนี้ฉันถือว่า?
Jarett Millard

1
"[vm.min_free_kbytes] บังคับให้คอมพิวเตอร์พยายามเก็บ RAM ในจำนวนนี้ฟรีและในการทำเช่นนั้นจะจำกัดความสามารถในการแคชไฟล์ดิสก์" - ขอโทษที่รบกวน แต่สิ่งนี้ไม่เกี่ยวข้องกับสิ่งvm.min_free_kbytesใดเลย มันทำหน้าที่เป็นบล็อกของเพจที่สงวนไว้เพื่อลดความซับซ้อนของการ__GFP_WAITจัดสรรอะตอม (เช่นเติมหรือฆ่า / ไม่ - ) เมื่ออยู่ภายใต้การช่วงชิงหน่วยความจำระบบสูง มันอาจจะเหมาะสมที่จะยกมาที่นี่ (เนื่องจากแผงลอยเหล่านี้เกี่ยวข้องกับการช่วงชิงความจำของระบบ) แต่มันคงไม่เหมาะสำหรับเหตุผลที่อธิบายไว้ในคำตอบนี้
คริสลง

9

สิ่งนี้เกิดขึ้นกับฉันในการติดตั้งใหม่ของ Ubuntu 14.04

ในกรณีของฉันมันไม่มีส่วนเกี่ยวข้องกับปัญหา sysctl ที่กล่าวถึง

แต่ปัญหาคือ UUID ของพาร์ติชัน swap นั้นแตกต่างกันระหว่างการติดตั้งแทนที่จะเป็นหลังการติดตั้ง ดังนั้นการแลกเปลี่ยนของฉันจึงไม่เปิดใช้งานและเครื่องของฉันจะล็อคหลังจากใช้งานไปสองสามชั่วโมง

วิธีการแก้ปัญหาคือการตรวจสอบ UUID ปัจจุบันของพาร์ทิชัน swap กับ

sudo blkid

แล้วsudo nano /etc/fstabแทนที่ค่า UUID ของการแลกเปลี่ยนที่ไม่ถูกต้องด้วยค่าที่รายงานโดย blkid

รีบูตง่าย ๆ ที่จะส่งผลกระทบต่อการเปลี่ยนแปลงและ voila


3
ขอบคุณมาก! ฉันได้รับการดิ้นรนกับข้อผิดพลาดที่ทำให้โกรธอย่างไม่น่าเชื่อสำหรับสิ่งที่ใกล้กับปีนี้และได้พยายามทุกอย่างเพื่อแก้ไข เหตุใด Linux จึงมีพฤติกรรมนี้ ดูเหมือนว่ามันควรจะทำตัวเหมือนไม่มีการสับเปลี่ยนและเรียกใช้ OOM-killer แต่ดูเหมือนว่าจะแกล้งเหมือนมีการสลับ แต่ก็ล้มเหลวในการสลับสิ่งต่าง ๆ ออกมา (เพราะไม่มีจริง ๆ เนื่องจากมีการกำหนดค่าที่ไม่เหมาะสม)
crazy2be

@ crazy2be มันไม่ได้ล้มเหลว แต่ก็ประสบความสำเร็จอย่างไม่มีที่สิ้นสุด แม้ไม่มีการสลับใด ๆ ก็ตาม Linux ยังคงสามารถเลื่อนหน้าโปรแกรมและไฟล์ที่ไม่ได้แก้ไขในหน่วยความจำและอ่านใหม่จากดิสก์
Martin Thornton

4

ฉันรู้ว่าคำถามนี้เก่า แต่ฉันมีปัญหานี้ใน Ubuntu (Chrubuntu) 14.04 ใน Acer C720 Chromebook ฉันลองใช้วิธีแก้ปัญหาของKrišjānis Nesenbergs แล้วก็ใช้งานได้บ้าง แต่บางครั้งก็ล้มเหลว

ในที่สุดฉันก็พบวิธีแก้ปัญหาที่ทำงานโดยการติดตั้ง zram แทนที่จะใช้การแลกเปลี่ยนแบบฟิสิคัลบน SSD หากต้องการติดตั้งฉันเพิ่งทำตามคำแนะนำที่นี่เช่นนี้:

sudo apt-get install zram-config

หลังจากนั้นฉันสามารถกำหนดขนาดของการแลกเปลี่ยน zram ได้โดยการแก้ไข/etc/init/zram-config.confที่บรรทัดที่ 21

20: # Calculate the memory to user for zram (1/2 of ram)
21: mem=$(((totalmem / 2 / ${NRDEVICES}) * 1024))

ฉันแทนที่ 2 ด้วย 1 เพื่อทำให้ขนาดของ zram เท่ากับขนาดของ ram ที่ฉันมี ตั้งแต่ทำเช่นนั้นฉันไม่ค้างหรือไม่ตอบสนองต่อระบบมากขึ้น


zramเป็นตัวเลือกที่ทำงานได้หากคุณไม่สามารถติดตั้ง RAM เพิ่มเติมได้ หากระบบช้าเกินไปเมื่อเปลี่ยนไปใช้ SSD และออกจาก RAM โดยไม่ต้องสลับจากนั้นzramอาจช่วยได้เล็กน้อยจนกว่าคุณจะพยายามทำเพิ่มอีกเล็กน้อยและผลลัพธ์จะเหมือนกับ RAM หมดโดยไม่มีการสลับ
Mikko Rantalainen

4

ไม่มีอะไรทำงานให้ฉัน !!

ดังนั้นฉันจึงเขียนสคริปต์เพื่อตรวจสอบการใช้งานหน่วยความจำ ก่อนอื่นจะพยายามล้างแคช RAM หากปริมาณการใช้หน่วยความจำเพิ่มขึ้น คุณสามารถกำหนดค่าขีด จำกัด นี้บนสคริปต์ หากปริมาณการใช้หน่วยความจำไม่ได้ต่ำกว่าเกณฑ์ก็จะเริ่มต้นกระบวนการฆ่าโดยหนึ่งในการลดลำดับการใช้หน่วยความจำจนกว่าปริมาณการใช้หน่วยความจำต่ำกว่าเกณฑ์ ฉันได้ตั้งไว้ที่ 96% โดยค่าเริ่มต้น คุณสามารถกำหนดค่าได้โดยเปลี่ยนค่าของตัวแปร RAM_USAGE_THRESHOLD ในสคริปต์

ฉันยอมรับว่ากระบวนการฆ่าซึ่งใช้หน่วยความจำสูงไม่ใช่โซลูชันที่สมบูรณ์แบบ แต่ควรฆ่าแอปพลิเคชั่นเดียวแทนการทำงานทั้งหมด !! สคริปต์จะส่งการแจ้งเตือนทางเดสก์ท็อปถึงคุณหากการใช้ RAM เพิ่มขีด จำกัด นอกจากนี้ยังจะแจ้งให้คุณทราบหากมันฆ่ากระบวนการใด ๆ

#!/usr/bin/env python
import psutil, time
import tkinter as tk
from subprocess import Popen, PIPE
import tkinter
from tkinter import messagebox
root = tkinter.Tk()
root.withdraw()

RAM_USAGE_THRESHOLD = 96
MAX_NUM_PROCESS_KILL = 100

def main():
    if psutil.virtual_memory().percent >= RAM_USAGE_THRESHOLD:
        # Clear RAM cache
        mem_warn = "Memory usage critical: {}%\nClearing RAM Cache".\
            format(psutil.virtual_memory().percent)
        print(mem_warn)
        Popen("notify-send \"{}\"".format(mem_warn), shell=True)
        print("Clearing RAM Cache")
        print(Popen('echo 1 > /proc/sys/vm/drop_caches',
                    stdout=PIPE, stderr=PIPE,
                    shell=True).communicate())
        post_cache_mssg = "Memory usage after clearing RAM cache: {}%".format(
                            psutil.virtual_memory().percent)
        Popen("notify-send \"{}\"".format(post_cache_mssg), shell=True)
        print(post_cache_mssg)

        if psutil.virtual_memory().percent < RAM_USAGE_THRESHOLD:
            print("Clearing RAM cache saved the day")
            return
        # Kill top C{MAX_NUM_PROCESS_KILL} highest memory consuming processes.
        ps_killed_notify = ""
        for i, ps in enumerate(sorted(psutil.process_iter(),
                                      key=lambda x: x.memory_percent(),
                                      reverse=True)):
            # Do not kill root
            if ps.pid == 1:
                continue
            elif (i > MAX_NUM_PROCESS_KILL) or \
                    (psutil.virtual_memory().percent < RAM_USAGE_THRESHOLD):
                messagebox.showwarning('Killed proccess - save_hang',
                                       ps_killed_notify)
                Popen("notify-send \"{}\"".format(ps_killed_notify), shell=True)
                return
            else:
                try:
                    ps_killed_mssg = "Killed {} {} ({}) which was consuming {" \
                                     "} % memory (memory usage={})". \
                        format(i, ps.name(), ps.pid, ps.memory_percent(),
                               psutil.virtual_memory().percent)
                    ps.kill()
                    time.sleep(1)
                    ps_killed_mssg += "Current memory usage={}".\
                        format(psutil.virtual_memory().percent)
                    print(ps_killed_mssg)
                    ps_killed_notify += ps_killed_mssg + "\n"
                except Exception as err:
                    print("Error while killing {}: {}".format(ps.pid, err))
    else:
        print("Memory usage = " + str(psutil.virtual_memory().percent))
    root.update()


if __name__ == "__main__":
    while True:
        try:
            main()
        except Exception as err:
            print(err)
        time.sleep(1)

บันทึกรหัสในไฟล์ชื่อว่า save_hang.py เรียกใช้สคริปต์เป็น:

sudo python save_hang.py

โปรดทราบว่าสคริปต์นี้เข้ากันได้กับ Python 3 เท่านั้นและคุณต้องติดตั้งแพ็คเกจ tkinter คุณสามารถติดตั้งเป็น:

sudo apt-get install python3-tk

หวังว่านี่จะช่วย ...


2

ฉันเดาว่าคุณได้ตั้งค่าของคุณvm.swappinessไว้ต่ำมากซึ่งทำให้เคอร์เนลสลับสายเกินไปทำให้เหลือแรมต่ำเกินไปสำหรับระบบที่จะทำงานด้วย

คุณสามารถแสดงการตั้งค่า swappiness ปัจจุบันของคุณโดยดำเนินการ:

sysctl vm.swappiness

โดยค่าเริ่มต้นนี้ถูกตั้งไว้ที่ 60 Ubuntu Wikiแนะนำให้ตั้งเป็น 10 แต่อย่าลังเลที่จะตั้งเป็นค่าที่สูงขึ้น คุณสามารถเปลี่ยนได้โดยการเรียกใช้:

sudo sysctl vm.swappiness=10

นี้จะเปลี่ยนมันเป็นเซสชั่นปัจจุบันเท่านั้นที่จะทำให้มันถาวรคุณจะต้องเพิ่มvm.swappiness = 10ไปยัง/etc/sysctl.confไฟล์

หากดิสก์ของคุณช้าให้พิจารณาซื้อใหม่


การลดการแลกเปลี่ยนจริงช่วยลดปัญหา (เกิดขึ้นน้อยมาก) ตอนนี้ฉันกำลัง 5 ปี แม้ว่ามันอาจจะเป็นปัญหาอีกอย่างหนึ่งของการเปลี่ยนที่สูงขึ้นเพราะเมื่อ 60 และฉันตัดสินใจที่จะดูหนังหรือแก้ไขไฟล์ขนาดใหญ่ทั้งไฟล์และเกือบ GB ถูกโหลดในหน่วยความจำและจากนั้นระบบก็เริ่มสลับโปรแกรมที่ฉัน ใช้อย่างแข็งขันและแม้กระทั่งส่วนต่อประสานกับผู้ใช้ สิ่งที่ฉันคิดว่าฉันเข้าใจส่วนการแลกเปลี่ยนสิ่งที่ฉันต้องการคือการฆ่าผู้ใช้แอปพลิเคชันโลภแทนการแช่แข็งเครื่องเมื่อหมด ram (และควร จำกัด ขนาดไฟล์ในแคช)
Krišjānis Nesenbergs

@Krisa: เมื่อระบบไม่มีหน่วยความจำ (RAM และ swap) เคอร์เนลเรียก oom_kill ซึ่งฆ่ากระบวนการเพื่อบันทึกหน่วยความจำ น่าเสียดายที่คุณไม่สามารถควบคุมกระบวนการเป้าหมายได้ หากต้องการเรียกใช้งานด้วยตนเองให้กด Alt + SysRq + F เมื่อรันdmesgคำสั่งคุณควรเห็นข้อมูลบางอย่าง (และชื่อกระบวนการ + id) ของกระบวนการ ฉันคิดว่าคุณควรซื้อดิสก์ใหม่ที่เร็วกว่า หรืออัพเกรดแรมของคุณ
Lekensteyn

3
ปัญหาคือว่า oom_kill จะไม่ถูกเรียกก่อนที่คอมพิวเตอร์จะล็อคเป็นเวลา 30 นาที นอกจากนี้ - อย่างน้อยมีวิธีที่จะรู้ว่ากระบวนการใดที่จะถูกฆ่าเสียก่อน?
Krišjānis Nesenbergs

2
ฉันมี 2GB Ram และ HDD คือ 5400 รอบต่อนาที ฉันไม่คิดว่ามันจะเป็นระบบเก่าที่ใช้เวลาครึ่งชั่วโมงในการรับชมวิดีโอบนหน้าจอเดียวและเรียกดูแท็บ 20-30 แท็บอื่น ๆ ที่จริงแล้วฉันจะมีความสุขมากถ้าฉันสามารถ allways เข้าถึงคอนโซลและฆ่ากระบวนการบางอย่าง - มีวิธีที่จะทำให้การป้อนข้อมูลของผู้ใช้และลำดับความสำคัญสูงสุดขั้วเพื่อให้มันทำงานในขณะที่ระบบค้าง?
Krišjānis Nesenbergs

1
อย่างไรก็ตาม - การสลับและปริมาณของ RAM นั้นค่อนข้างน่าสนใจ ปัญหาคือระบบนั้นไม่ตอบสนองเป็นเวลานานแม้ว่าการสลับจะถูกปิดใช้งานและหลังจากนั้นบางครั้งก็ยังเรียกใช้โปรแกรม (ดังนั้นจึงจัดการเพื่อค้นหาหน่วยความจำที่ใดที่หนึ่ง) และเวลาอื่น ๆ จะเรียกใช้ oom_killer ระบบควรจะบอกได้ว่า RAM หมดและไม่ปล่อยให้ฉันทำอะไรมากกว่านี้ ดังนั้นมีวิธีใดที่จะหยุดการค้างหรือตั้งค่าลำดับความสำคัญของการป้อนข้อมูลของผู้ใช้สูงมากฉันสามารถสลับไปที่คอนโซลเมื่อพวกเขาเกิดขึ้นและฆ่ากระบวนการบางอย่างด้วยตัวเอง?
Krišjānis Nesenbergs

2

ฉันดิ้นรนกับปัญหานี้มานาน แต่ตอนนี้ดูเหมือนว่าจะได้รับการแก้ไขบนแล็ปท็อปของฉัน

หากไม่มีคำตอบอื่นใดที่เหมาะกับคุณ (ฉันลองคำตอบส่วนใหญ่แล้ว) เล่นกับmin_free_kbytesเพื่อให้มีพื้นที่มากขึ้นใน RAM เมื่อคอมพิวเตอร์ของคุณเริ่มทำการแลกเปลี่ยน (ก่อนที่จะกดค่าต่ำสุดนี้บน RAM ฟรีของคุณ)

ฉันมี RAM 16GB แต่เร็วกว่านั้นหน่วยความจำก็เต็มและหยุดการตอบสนองเป็นเวลา 10 ถึง 30 นาทีจนกระทั่งมีบางสิ่งเปลี่ยนไป

อย่างน้อยสำหรับฉันการตั้งค่าmin_free_kbytesเหนือสิ่งที่แนะนำทำให้กระบวนการแลกเปลี่ยนเร็วขึ้นอย่างมาก

สำหรับ RAM 16GB ให้ลองทำสิ่งนี้:

vm.min_free_kbytes=500000

หากต้องการตั้งค่านี้ให้ดูคำตอบอื่น ๆ หรือเพียงแค่ google :)


0

ฉันเรียกใช้หนึ่งในแล็ปท็อปของฉันจากการ์ด Ubuntu สด SD อย่างต่อเนื่องพร้อมกับพาร์ติชันเก็บข้อมูลขนาดเล็ก ext4 และไฟล์สลับบนฮาร์ดไดรฟ์ เมื่อใช้ RAM เกือบทั้งหมดและค่า swappiness ต่ำเกินไป (บางครั้งฉันชอบที่จะเก็บฮาร์ดไดรฟ์ไว้อย่างสมบูรณ์ถ้าเป็นไปได้เพราะมันมีเสียงดัง), ประสิทธิภาพของ Linux มีแนวโน้มที่จะหลุดจากหน้าผาสำหรับฉัน TTY1 เพื่อฆ่า Firefox ใช้เวลา 15 นาที

การเพิ่ม/proc/sys/vm/vfs_cache_pressureจากค่าเริ่มต้น 100 เป็นค่า 6,000 ดูเหมือนจะช่วยป้องกันปัญหานี้ได้ อย่างไรก็ตามเอกสารเคอร์เนลเตือนไม่ให้ทำเช่นนั้นพูด

Increasing vfs_cache_pressure significantly beyond 100 may have negative
performance impact. Reclaim code needs to take various locks to find freeable
directory and inode objects. With vfs_cache_pressure=1000, it will look for
ten times more freeable objects than there are.

ฉันไม่แน่ใจในผลข้างเคียงของการทำเช่นนี้ดังนั้นฉันจึงควรระมัดระวังในการทำเช่นนี้


คุณอาจจะได้รับผลลัพธ์ที่ดีกว่าโดยvfs_cache_pressureใกล้ถึง 10 (นั่นคือน้อยกว่า 100) และการตั้งค่าที่min_free_kbytesสูงขึ้น ถูกเตือนว่าถ้าคุณตั้งค่าไว้min_free_kbytesสูงเกินไป OOM kernel kernel จะฆ่าทุกคน!
Mikko Rantalainen

@MikkoRantalainen ฉันได้ยกระดับmin_free_kbytesเป็น 262144 แล้วและฉันพบว่าการลดลงvfs_cache_pressureมีผลตรงกันข้าม - ลดลงต่ำกว่า 100 ทำให้ระบบไม่ตอบสนองเร็วขึ้นมาก ฉันไม่แน่ใจว่าทำไม
Hitechcomputergeek

โดยทั่วไปแล้วการเพิ่มขึ้นvfs_cache_pressureจะส่งผลให้เกิดความต้องการ direntries ก่อนเนื้อหาของไฟล์แคชและดังนั้นประสิทธิภาพโดยรวมมักจะมีค่ามากกว่า 100 หากคุณสามารถหาขั้นตอนในการทำซ้ำเพื่อหยุดการทำงานผิดพลาด / เริ่มระบบเช่น Ubuntu Live CD จากนั้นผู้พัฒนาเคอร์เนลสามารถหาสาเหตุที่แท้จริงได้ สำหรับฉันแล้วการแฮงค์จะเกิดขึ้นโดยไม่มีการเตือนล่วงหน้า สิ่งที่ดีที่สุดที่ฉันคาดเดาก็คือเคอร์เนลค้างเนื่องจาก OOM ก่อนที่ OOM Killer จะปล่อย RAM ให้เพียงพอ ตอนนี้ฉันใช้งาน min_free_kbytes = 100000, admin_reserve_kbytes = 250000 และ user_reserve_kbytes = 500000
Mikko Rantalainen

(ต่อ) ฉันยังไม่ได้ชนกับการตั้งค่าด้านบนแม้ว่าฉันจะมี swappiness = 5 และ vfs_cache_pressure = 20 ระบบมี RAM 16 GB และ swap 8 GB บน SSD อีกระบบหนึ่งมี RAM ขนาด 32 GB และการแลกเปลี่ยนเป็นศูนย์และดูเหมือนจะสุ่มจากปัญหาเดียวกัน - มีการกด Alt + SysRq + f หลังจากระบบรู้สึกช้าดูเหมือนว่าจะช่วยได้ดังนั้นฉันเดาว่า OOM Killer ทำงานเร็วพอที่ระบบจะไม่หยุดทำงาน
Mikko Rantalainen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.