การทำให้ Linux อ่านสลับกลับเข้าไปในหน่วยความจำ


28

เคอร์เนล Linux สลับหน้าส่วนใหญ่ออกจากหน่วยความจำเมื่อฉันเรียกใช้แอปพลิเคชันที่ใช้หน่วยความจำกายภาพ 16GB ส่วนใหญ่ หลังจากที่แอปพลิเคชันเสร็จสิ้นทุกการกระทำ (การพิมพ์คำสั่งการสลับพื้นที่ทำงานการเปิดหน้าเว็บใหม่ ฯลฯ ) ใช้เวลานานมากในการทำให้เสร็จสมบูรณ์

มีวิธีบอกเคอร์เนล Linux ให้คัดลอกหน้าจากสลับกลับไปยังหน่วยความจำกายภาพโดยไม่ต้องสัมผัส (และรอ) แต่ละแอปพลิเคชันด้วยตนเองหรือไม่? ฉันใช้งานแอปพลิเคชั่นจำนวนมากดังนั้นการรอคอยจึงเจ็บปวดเสมอ

ฉันมักจะใช้swapoff -a && swapon -aเพื่อทำให้ระบบตอบสนองได้อีกครั้ง แต่จะเป็นการลบหน้าที่ไม่ต้องการสลับดังนั้นพวกเขาจึงต้องเขียนอีกครั้งในครั้งต่อไปที่ฉันเรียกใช้สคริปต์

มีอินเตอร์เฟสของเคอร์เนลหรืออาจใช้ sysfs เพื่อสั่งให้เคอร์เนลอ่านหน้าทั้งหมดจากการสลับ?

แก้ไข: ฉันกำลังมองหาวิธีที่จะทำให้การแลกเปลี่ยน swapcached ทั้งหมด (ขอบคุณ Derobert!)

[PS serverfault.com/questions/153946/…และserverfault.com/questions/100448/…เป็นหัวข้อที่เกี่ยวข้อง แต่ไม่ได้ตอบคำถามว่าจะให้เคอร์เนล Linux คัดลอกหน้าจาก swap กลับไปยังหน่วยความจำได้อย่างไรโดยไม่ต้องสลับ swap]


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

ฉันไม่คิดว่าจะปล่อยให้ swap อยู่ในสถานะ swapcached สำหรับฉันแล้วดูเหมือนว่าข้อเสนอแนะของคุณเป็นทางเลือกสำหรับวิธีการ swapoff-swapon
drrossum

ไม่มันไม่ได้ทำการแลกเปลี่ยน(ซึ่งเป็นที่ยอมรับว่าแปลกสำหรับฉันเล็กน้อย)มันเก็บ RAM ในบางจุดที่คุณเห็นว่าสำคัญที่สุดจากนั้นจึงอุทิศหน่วยความจำระบบทั้งหมดไปยังงานที่ต้องทำมากก่อนที่จะกู้คืนแคชเมื่อ งานผ่าน หากการสลับระหว่างงานที่ต้องทำอย่างเข้มข้นนั้นเป็นสิ่งที่คุณต้องการคุณจะทำช้าๆว่างานที่ทำลงไปนั้นจะต้องใช้เวลาเพิ่มในการสลับหน้าที่คุณไปด้วยกัน
mikeserv

คำตอบ:


4

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

#!/bin/bash
declare -A Q
for i in "$@"; do
    E=$(readlink /proc/$i/exe);
    if [ -z "$E" ]; then.
        #echo skipped $i;.
        continue;.
    fi
    if echo $E | grep -qF memdump; then.
        #echo skipped $i >&2;.
        continue;.
    fi
    if [ -n "${Q[${E}]}" ]; then.
        #echo already $i >&2;.
        continue;.
    fi
    echo "$i $E" >&2
    memdump $i 2> /dev/null
    Q[$E]=$i
done | pv -c -i 2 > /dev/null

การใช้งาน: สิ่งที่ชอบ

# ./remember $(< /mnt/cgroup/tasks )
1 /sbin/init
882 /bin/bash
1301 /usr/bin/hexchat
...
2.21GiB 0:00:02 [ 1.1GiB/s] [  <=>     ]
...
6838 /sbin/agetty
11.6GiB 0:00:10 [1.16GiB/s] [      <=> ]
...
23.7GiB 0:00:38 [ 637MiB/s] [   <=>    ]
# 

มันข้ามหน่วยความจำที่ไม่ได้ทำการสลับอย่างรวดเร็ว (กิกะไบต์ต่อวินาที) และช้าลงเมื่อจำเป็นต้องสลับ


เครื่องมือนี้ทำสิ่งที่ฉันต้องการอย่างแน่นอน ขอบคุณ!
drrossum

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

11

มันอาจช่วยให้ up /proc/sys/vm/page-cluster(ค่าเริ่มต้น: 3)

จากเอกสารเคอร์เนล ( sysctl/vm.txt):

หน้าคลัสเตอร์

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

มันเป็นค่าลอการิทึม - ตั้งค่าเป็นศูนย์หมายถึง "1 หน้า" การตั้งค่าเป็น 1 หมายถึง "2 หน้า" การตั้งค่าเป็น 2 หมายถึง "4 หน้า" ฯลฯ เป็นศูนย์ปิดการแลกเปลี่ยน readahead อย่างสมบูรณ์

ค่าเริ่มต้นคือสาม (แปดหน้าพร้อมกัน) อาจมีประโยชน์เล็กน้อยในการปรับค่านี้ให้เป็นค่าอื่นหากเวิร์กโหลดของคุณมีการแลกเปลี่ยนอย่างมาก

ค่าที่ต่ำกว่าหมายถึงเวลาในการตอบสนองที่ต่ำกว่าสำหรับความผิดพลาดเริ่มต้น แต่ในเวลาเดียวกันความผิดพลาดเพิ่มเติมและความล่าช้าของ I / O สำหรับความผิดพลาดต่อไปนี้จะเป็นส่วนหนึ่งของหน้าต่อเนื่องที่อ่านมาแล้ว

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


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

tbh นี่อาจเป็นทางออกที่ดีที่สุดที่คุณจะได้รับ ฉันไม่เคยได้ยินมาก่อน แต่ดูเหมือนว่ามันจะเปลี่ยนเป็นชุดของ IOP ขนาดใหญ่แทนที่จะเป็นชุด IOP ขนาดเล็กที่ต่อเนื่องซึ่งอาจเป็นสาเหตุของปัญหาประสิทธิภาพการทำงานของคุณ ฉันจะประหลาดใจอย่างถูกต้องตามกฎหมายหากมีบางสิ่งที่แก้ไขสถานการณ์ของคุณได้อย่างสมบูรณ์แบบ
Bratchley

สำหรับเรื่องนั้นหากคุณกำลังประสบกับการชะลอตัวเนื่องจากการสลับขนาดเล็กจำนวนมากที่ต่อเนื่องกันเพียงแค่ปรับค่าอย่างถาวรpage-clusterอาจช่วยเพิ่มประสิทธิภาพได้
Ilmari Karonen

5

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

หน้าเว็บบางหน้าของพวกเขาจะยังคงถูกสลับเปลี่ยน แต่อาจทำให้เกิดปัญหาประสิทธิภาพการทำงานของคุณ ส่วนใหญ่อาจเป็นเพียงพฤติกรรม "หยุดและเริ่มต้น" เมื่อหน้าของโปรแกรมจำนวนมากอยู่ในการสลับและโปรแกรมต้องหยุดอย่างต่อเนื่องเพื่อสลับหน้าเป็นแรม แต่เพิ่มขึ้น 4k เท่านั้น

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


4

ดูเหมือนว่าฉันจะไม่สามารถ "ทำให้ระบบตอบสนองได้อย่างน่าอัศจรรย์" คุณอาจได้รับบทลงโทษหรืออ่านหน้าเว็บจากพื้นที่สว็อปในหน่วยความจำตอนนี้หรือคุณจะได้รับมันในภายหลัง แต่ไม่ทางใดก็ทางหนึ่งคุณได้รับมัน อันที่จริงถ้าคุณทำสิ่งที่ชอบswapoff -a && swapon -aแล้วคุณอาจจะรู้สึกมากขึ้นอาการปวดมากกว่าน้อยกว่าเพราะคุณบังคับให้หน้าบางที่จะคัดลอกกลับเข้าไปในหน่วยความจำที่จะเป็นอย่างอื่นไม่เคยได้รับความจำเป็นอีกครั้งและในที่สุดก็จะลดลงโดยไม่ต้องอ่าน (คิดว่าคุณออกจากโปรแกรมประยุกต์ในขณะที่ ส่วนใหญ่ของมันถูกสลับเป็นฮีปหน้าเหล่านั้นสามารถถูกทิ้งไปพร้อมกันโดยไม่ต้องอ่านกลับเข้าไปในหน่วยความจำ)

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

หน้าใดที่ได้รับการคัดลอกกลับมาจาก swap ในหน่วยความจำหลักก็น่าจะถูกปรับเปลี่ยนอยู่ดีดังนั้นถ้ามันจำเป็นต้องย้ายกลับไปที่ swap อีกครั้งในอนาคตมันจะต้องเขียนใหม่อีกครั้งใน swap โปรดจำไว้ว่าการสลับส่วนใหญ่เป็นหน่วยความจำฮีปไม่ใช่หน้าแบบอ่านอย่างเดียว (ซึ่งมักจะมีไฟล์สำรองไว้)

ฉันคิดว่าswapoff -a && swapon -aเคล็ดลับของคุณดีพอ ๆ กับสิ่งที่คุณคิด


นั่นคือเราสองคนพูดอย่างเดียวกันในเวลาเดียวกัน;)
goldilocks

@goldilocks ใช่ผมเห็นคำตอบของคุณจะปรากฏก่อนเหมืองก็พร้อม แต่ฉันถูกแล้ว¾ทำเพื่อฉันติดอยู่กับมัน :-)
Celada

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

ฉันเชื่อมั่นว่าคำตอบที่คุณอ้างถึงโดย David Spillettนั้นถูกต้อง: คุณสามารถมีเพจในการสลับและ RAM ในเวลาเดียวกัน ... แต่จนกว่ารุ่น RAM จะได้รับการแก้ไข จากนั้นคุณต้องทิ้งสำเนาที่ล้าสมัยในการแลกเปลี่ยน เมื่อฉันพูดว่า "ค่อนข้างหน้าใด ๆ ที่ได้รับการคัดลอกกลับจาก swap [... ] กำลังจะได้รับการแก้ไขต่อไป" สิ่งที่ฉันหมายถึงคือฉันคาดหวังว่านี่คือสิ่งที่เกิดขึ้นเกือบตลอดเวลาดังนั้นฉันจึงไม่คาดหวังหน้าเว็บ ในสถานที่ทั้งสองจะเป็นส่วนสำคัญที่น่าเป็นห่วง
Celada

สถานการณ์การใช้งานของคุณอาจแตกต่างกัน: คุณอาจมีแอปพลิเคชันจำนวนมากที่มีฮีปขนาดใหญ่ที่มักอ่านและไม่ได้เขียน ความรู้สึกของฉันคือคนส่วนใหญ่ไม่มีสถานการณ์เช่นนี้ แต่ถ้าคุณทำฉันเดาว่าคุณพูดถูก: swapoff -a && swapon -aจะไม่ดีสำหรับคุณ ฉันเดาว่าในกรณีนี้คุณต้องมีสิ่งที่สแกน/proc/<each-process>/memและอ่านหน่วยความจำแต่ละหน้าเพื่อให้แน่ใจว่ามีอยู่ใน RAM ไม่ทราบว่ามีอยู่จริง
Celada

0

มีการสนทนาที่ดีมากที่นี่คือhttp://rudd-o.com/en/linux-and-free-software/tales-from-responsivenessland-why-linux-feels-slow-and-how-to-fix-that ที่เดือดลงไปลดความว่องไวด้วยความคิดที่ว่าจะเพิ่มการรับรู้การตอบสนองของระบบหนึ่งควรป้องกันการแลกเปลี่ยนรหัส (และนี่คือสิ่งที่เกิดขึ้น) นี่ไม่ใช่คำตอบสำหรับคำถามของคุณ แต่สิ่งนี้อาจป้องกันไม่ให้ปัญหาปรากฏขึ้น (แอปพลิเคชันของคุณไม่ได้รับการแลกเปลี่ยนข้อมูลที่ไม่ได้ใช้เท่านั้นและแคชหน้า)


ในขณะที่สิ่งนี้อาจตอบคำถามในทางทฤษฎีมันก็ควรที่จะรวมส่วนสำคัญของคำตอบที่นี่และให้ลิงค์สำหรับการอ้างอิง
slm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.