ฉันจะใช้พื้นที่สว็อปในกรณีฉุกเฉินเท่านั้นได้อย่างไร


41

ฉันมีแล็ปท็อป Debian (Buster) ที่มี8 GB RAM และ 16GB swap ฉันกำลังทำงานที่ใช้เวลานานมาก นี่หมายความว่าแล็ปท็อปของฉันถูกทิ้งไว้ในช่วงหกวันที่ผ่านมาในขณะที่มันปั่นผ่าน

ขณะทำสิ่งนี้ฉันต้องใช้แล็ปท็อปเป็นระยะเป็นระยะ นี่ไม่ควรเป็นปัญหา งานที่ใช้เวลานานคือ I / O ที่ถูกผูกไว้ทำงานผ่านสิ่งต่างๆบนฮาร์ดดิสก์ USB และไม่ใช้ RAM (<200 MB) หรือ CPU (<4%) มากนัก

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

เมื่อดูจากการตรวจสอบระบบของ 2.5 GB ที่ใช้ประมาณครึ่งหนึ่งจะถูกเปลี่ยนเป็นการสลับ ฉันยืนยันว่าปัญหานี้เกิดจากการลบพื้นที่สว็อป ( swapoff /dev/sda8) ถ้าฉันทิ้งไว้โดยไม่มีพื้นที่สว็อปมันจะกลับมามีชีวิตอีกครั้งในทันทีแม้หลังจากผ่านไป 24 ชั่วโมง ด้วยการแลกเปลี่ยนมันเป็นอิฐในช่วงห้านาทีแรกที่เหลือเพียงหกชั่วโมง ฉันยืนยันว่าการใช้หน่วยความจำไม่เกิน3 GBแม้ในขณะที่ฉันไม่อยู่

ฉันได้พยายามลดความไม่แน่นอน ( ดูเพิ่มเติมที่: Wikipedia ) เป็นค่าของ10และ0แต่ปัญหายังคงมีอยู่ ดูเหมือนว่าหลังจากไม่มีกิจกรรมใด ๆ หนึ่งวันเคอร์เนลเชื่อว่า GUI ทั้งหมดไม่จำเป็นต้องใช้อีกต่อไปและจะทำการลบจาก RAM (สลับไปยังดิสก์) ภารกิจที่ใช้เวลานานคืออ่านไฟล์ทรีขนาดใหญ่และอ่านไฟล์ทุกไฟล์ ดังนั้นอาจเป็นเพราะเคอร์เนลสับสนในการคิดว่าการแคชจะช่วยได้ แต่ในการกวาดล้างเพียงหนึ่งเดียวของ HD TB USB 2 TB ที่มีชื่อไฟล์ประมาณ 1 พันล้านแรม GB พิเศษนั้นจะไม่ช่วยประสิทธิภาพมากนัก นี่คือแล็ปท็อปราคาถูกที่มีฮาร์ดไดรฟ์ซบเซา มันไม่สามารถโหลดข้อมูลกลับสู่ RAM เร็วพอ

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

คำจำกัดความที่แม่นยำของ "ฉุกเฉิน" อาจเป็นเรื่องของการถกเถียง แต่เพื่ออธิบายให้ชัดเจนว่าฉันหมายถึงอะไร: เหตุฉุกเฉินจะเป็นที่ที่ระบบทิ้งไว้โดยไม่มีตัวเลือกอื่นนอกจากแลกเปลี่ยนหรือฆ่ากระบวนการ


เหตุฉุกเฉินคืออะไร - คุณต้องถามจริง ๆ หรือไม่? ... ฉันหวังว่าคุณจะไม่พบว่าตัวเองอยู่ในอาคารที่คึกคัก!

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


การแก้ไขครั้งสุดท้าย: ฉันยอมรับคำตอบซึ่งทำสิ่งที่ฉันขออย่างแม่นยำในระดับระบบปฏิบัติการ ผู้อ่านในอนาคตควรจดคำตอบที่เสนอโซลูชันระดับแอปพลิเคชันด้วย


11
กำหนด "ฉุกเฉิน" และพูดอะไรบางอย่างเกี่ยวกับวิธีการที่แตกต่างจากสถานการณ์ปกติใด ๆ เมื่อจะใช้การแลกเปลี่ยน
Kusalananda

4
ฉันต้องการทราบว่าคุณต้องการกำหนด "กรณีฉุกเฉิน" แบบพิเศษนอกขอบเขตซึ่งจะทำให้เคอร์เนลใช้ swap แต่การสลับนั้นจะไม่ถูกใช้ หน่วยความจำเพจ AFAIK เป็นสิ่งที่ช้าและเพิ่งทำ "ในกรณีฉุกเฉิน" ต่อไปและสิ่ง "swappiness" เป็นสิ่งเดียวที่คุณสามารถใช้เพื่อปรับพฤติกรรมนี้ด้วย (แต่ฉันไม่ใช่ผู้ใช้ Linux)
Kusalananda

2
ไม่ถูกต้อง มันไม่เพียงทำในกรณีฉุกเฉินเท่านั้น อย่างน้อยที่สุดฉันคิดว่าคำถามของฉันทำให้มันชัดเจนว่าฉันใช้เพียง 3GB จาก 8GB เท่านั้น ... นั่นแทบจะเป็นกรณีฉุกเฉิน แต่เคอร์เนลก็เปลี่ยนไป ฉันขอแนะนำให้คุณอ่านเรื่อง swappiness และหัวข้อโดยรอบ มีการถกเถียงกันหลาย ๆ เหตุผลเกี่ยวกับการแลกเปลี่ยน มันจะเป็นไปได้ฉันขอแนวคิดที่ไม่อยู่ใน kernel แต่เหตุผลของผมขอให้มันมีเหตุผลธรรมดี ..
ฟิลิป Couling

4
ฉันรู้จักคำแนะนำเสมอว่า "ไม่เคยทำงานโดยไม่มีการสลับ" แต่ขนาดหน่วยความจำนั้นมีขนาดของฮาร์ดไดรฟ์ที่ปรับขนาด (HDD ไม่ใช่ SSD) ความเร็วในการอ่าน / เขียนหมายความว่าการแลกเปลี่ยนนั้นเป็นความคิดที่แย่มากขึ้นเรื่อย ๆ รู้สึกเหมือนมีบางคนเชื่อว่าการแลกเปลี่ยน 8GB RAM + 8GB จะออกมาเพื่อดำเนินการ 16 GB RAM + 0 swap ถ้ามันทำจริงๆแล้วมีบางอย่างผิดปกติกับเคอร์เนล Linux
Philip Couling

7
@Philip Couling: ไม่ประเด็นคือการที่ 16 GB RAM + 16 GB swap จะมีประสิทธิภาพสูงกว่า 16 GB และ 0 swap - โดยเฉพาะอย่างยิ่งเมื่อโค้ดของคุณต้องมีหน่วยความจำ 17 GB :-)
jamesqf

คำตอบ:


11

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

ดีกว่าที่จะใช้zramกับพาร์ทิชัน swap สำรองขนาดเล็ก ระบบปฏิบัติการส่วนใหญ่เช่น ChromeOS, Android และ Linux distros ต่าง ๆ ได้เปิดใช้งาน zram เป็นค่าเริ่มต้นเป็นเวลาหลายปีโดยเฉพาะอย่างยิ่งสำหรับระบบที่มี RAM น้อยกว่า มันเร็วกว่า swap บน HDD และคุณสามารถสัมผัสได้ถึงการตอบสนองของระบบในกรณีนี้อย่างชัดเจน น้อยกว่าบน SSD แต่จากผลการวัดประสิทธิภาพที่นี่ก็ยังดูเหมือนเร็วขึ้นแม้ว่าอัลกอริทึม lzo เริ่มต้น คุณสามารถเปลี่ยนเป็นlz4เพื่อประสิทธิภาพที่ดียิ่งขึ้นด้วยอัตราส่วนการบีบอัดที่น้อยลงเล็กน้อย ความเร็วในการถอดรหัสนั้นเร็วกว่า lzo เกือบ 5 เท่าตามเกณฑ์มาตรฐานอย่างเป็นทางการ

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

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

อ่านเพิ่มเติม


เพียงเพื่อให้ฉันเข้าใจคุณกำลังบอกว่าฉันสามารถสร้างzramอุปกรณ์บล็อกใช้มันเป็น swap โดยมีการสลับลำดับความสำคัญต่ำกว่าเป็นพาร์ติชัน HDD?
Philip Couling

@PhilipCouling ถ้าคุณใช้ HDD แล้วใช่แน่นอนคุณควรใช้ zram หรือโซลูชั่นที่คล้ายกัน ลำดับความสำคัญของการแลกเปลี่ยนควรจะต่ำกว่า zram ดังนั้น Linux พยายามที่จะใช้ zram ก่อนแล้วจึงพิจารณาการสลับ ถ้าคุณใช้อูบุนตูแล้วแพ็คเกจ zram-config จะดูแลการตั้งค่าลำดับความสำคัญสำหรับคุณอยู่แล้ว
phuclv

3
ฉันยอมรับคำตอบนี้เพราะดูเหมือนจะทำสิ่งที่ฉันขอ หากฉันยังคงเปิดใช้งานการสลับ 16GB ที่ระดับความสำคัญลดลงเคอร์เนลจะใช้เมื่อ zswap หมดลงเท่านั้น IE: "ในกรณีฉุกเฉิน" หมายเหตุเกี่ยวกับ debian-buster สิ่งนี้ง่ายต่อการติดตั้งเพียงแค่ติดตั้งเครื่องมือ zram
Philip Couling

25

วิธีแก้ไขอย่างหนึ่งคือตรวจสอบให้แน่ใจว่าตัวควบคุม cgroup ของหน่วยความจำเปิดใช้งานอยู่ (ฉันคิดว่ามันเป็นค่าเริ่มต้นในเคอร์เนลที่ยังไม่ถึงครึ่งไม่เช่นนั้นคุณจะต้องเพิ่มลงcgroup_enable=memoryในบรรทัดคำสั่งเคอร์เนล) จากนั้นคุณสามารถรันงานเร่งรัด I / O ของคุณใน cgroup ด้วยการ จำกัด หน่วยความจำซึ่ง จำกัด จำนวนแคชที่สามารถใช้งานได้

หากคุณใช้ systemd คุณสามารถตั้งค่า+MemoryAccounting=yesและMemoryHigh/ MemoryMaxหรือMemoryLimit(ขึ้นอยู่กับว่าคุณใช้ cgroup v1 หรือ v2) ในหน่วยหรือส่วนที่มี หากชิ้นของคุณสามารถใช้systemd-runเพื่อเรียกใช้โปรแกรมในชิ้น

ตัวอย่างเต็มรูปแบบจากหนึ่งในระบบของฉันสำหรับใช้ Firefox โดยมีหน่วยความจำ จำกัด หมายเหตุสิ่งนี้ใช้ cgroups v2 และตั้งค่าเป็นผู้ใช้ของฉันไม่ใช่รูท (หนึ่งในข้อดีของ v2 เหนือ v1 คือการมอบสิ่งนี้ให้กับผู้ที่ไม่ใช่รูทนั้นปลอดภัยดังนั้น systemd จึงทำ)

$ systemctl --user cat mozilla.slice 
# /home/anthony/.config/systemd/user/mozilla.slice
[Unit]
Description=Slice for Mozilla apps
Before=slices.target

[Slice]
MemoryAccounting=yes
MemoryHigh=5G
MemoryMax=6G

$ systemd-run --user --slice mozilla.slice --scope -- /usr/bin/firefox &
$ systemd-run --user --slice mozilla.slice --scope -- /usr/bin/thunderbird &

ฉันพบว่าให้ผู้ใช้ทำงานฉันต้องใช้ชิ้นงาน ระบบหนึ่งทำงานเพียงแค่ใส่ตัวเลือกในไฟล์บริการ (หรือใช้systemctl set-propertyกับบริการ)

นี่คือตัวอย่างบริการ (โดยใช้ cgroup v1) ให้สังเกตสองบรรทัดสุดท้าย นี่เป็นส่วนหนึ่งของอินสแตนซ์ของระบบ (pid = 1)

[Unit]
Description=mount S3QL filesystem
Requires=network-online.target
After=network-online.target

[Install]
WantedBy=multi-user.target

[Service]
Type=forking
User=s3ql-user
Group=s3ql-user
LimitNOFILE=20000
ExecStartPre=+/bin/sh -c 'printf "S3QL_CACHE_SIZE=%%i\n" $(stat -c "%%a*%%S*.90/1024" -f /srv/s3ql-cache/ | bc) > /run/local-s3ql-env'
ExecStartPre=/usr/bin/fsck.s3ql  --cachedir /srv/s3ql-cache/fs1 --authfile /etc/s3ql-authinfo  --log none «REDACTED»
EnvironmentFile=-/run/local-s3ql-env
ExecStart=/usr/bin/mount.s3ql --keep-cache --cachedir /srv/s3ql-cache/fs1 --authfile /etc/s3ql-authinfo --cachesize ${S3QL_CACHE_SIZE} --threads 4
ExecStop=/usr/bin/umount.s3ql /mnt/S3QL/
TimeoutStopSec=2m
MemoryAccounting=yes
MemoryLimit=1G

systemd.resource-control(5)เอกสารที่อยู่ใน


1
คุณไม่สามารถทำสิ่งที่เปรียบเทียบและพกพาได้ด้วยการใช้ulimitหรือ
โปรเก่า

1
@OldPro ไม่ได้จริงๆ ครั้งแรกไม่มี AFAIK ulimit ในการใช้หน่วยความจำทั้งหมดรวมถึงหน้าแคช (ซึ่งเป็นการใช้งานที่มากเกินไปที่นี่) ประการที่สอง ulimit สำหรับหน่วยความจำเป็นกระบวนการต่อกลุ่ม cg ทำงานแม้ว่างานที่ใช้เวลานานส้อม
derobert

ผมคิดว่าหน่วยความจำเหตุผลที่บัญชีถูกเปิดใช้งานในระบบใหม่เป็นเพราะการเปลี่ยนแปลงในsystemdรุ่น 238
sourcejedi

1
@sourcejedi ที่ค่อนข้างล่าสุด เมื่อตัวควบคุมหน่วยความจำถูกนำมาใช้ครั้งแรกเพียงแค่มีให้ใช้งาน (ไม่ได้ใช้งาน) มีค่าใช้จ่ายที่มีประสิทธิภาพมากพอที่ distros บางอย่างถูกปิดการใช้งานโดยค่าเริ่มต้นและคุณต้องผ่านอาร์กิวเมนต์บรรทัดคำสั่งเคอร์เนลเพื่อเปิดใช้งาน ปัญหาด้านประสิทธิภาพได้รับการแก้ไขดังนั้นการเปลี่ยนแปลงและอีกไม่นาน systemd ก็จะเปิดใช้งานเช่นกันตามค่าเริ่มต้น
derobert

14

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

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

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

หากคุณรู้ว่าเมื่อใดที่คุณจะต้องใช้แล็ปท็อปของคุณใหม่ล่วงหน้าคุณอาจใช้atคำสั่ง (หรือcrontab) เพื่อกำหนดตารางการล้างค่า swap ( swapoff -a;swapon -a)

เนื่องจากการทำความสะอาด swap อาจทำให้ overkill และแม้แต่เรียก OOM killer ถ้าด้วยเหตุผลบางอย่างไม่ใช่ทุกอย่างที่อยู่ใน RAM คุณอาจแค่ "unswap" 2ทุกอย่างที่เกี่ยวข้องกับแอปพลิเคชันที่ทำงานอยู่ที่คุณต้องการจะฟื้นขึ้นมาใหม่

วิธีหนึ่งในการทำเช่นนั้นก็คือการแนบตัวดีบั๊กเกอร์gdbกับแต่ละกระบวนการที่ได้รับผลกระทบและทริกเกอร์การสร้างการถ่ายโอนข้อมูลหลัก

# gdb -p <pid>
...
generate-core-dump /dev/null
...
quit

ตามที่คุณเขียนไว้แอปพลิเคชันที่รันเป็นเวลานานของคุณจะไม่นำข้อมูลที่อ่านมาใหม่หลังจากผ่านการเริ่มต้นใหม่ดังนั้นคุณจึงอยู่ในกรณีเฉพาะที่การแคชระยะยาวไม่มีประโยชน์ จากนั้นการข้ามแคชโดยใช้ direct I / O เช่นเดียวกับที่แนะนำโดย Will Crawford ควรเป็นวิธีแก้ปัญหาที่ดี

อีกวิธีหนึ่งคุณอาจล้างแคชไฟล์เป็นประจำด้วยการสะท้อน1หรือ3ไปยัง/proc/sys/vm/drop_cachesไฟล์หลอกก่อนที่ระบบปฏิบัติการจะคิดว่าเป็นความคิดที่ดีที่จะสลับแอพพลิเคชัน GUI และสภาพแวดล้อมของคุณออก

ดูที่คุณจะลบบัฟเฟอร์และแคชในระบบ Linux ได้อย่างไร สำหรับรายละเอียด

1 ไม่ได้ใช้งานในแง่: ไม่มีการใช้งานอย่างจริงจังอีกต่อไปตั้งแต่ช่วงเวลาสำคัญหน่วยความจำยังคงเกี่ยวข้องกับเจ้าของ
2 ใส่กลับไปที่หน้า RAM ที่เก็บไว้ในพื้นที่สลับ


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

5
"ฉันไม่คิดว่าเคอร์เนลของ Linux นั้นฟรีหรือคาดการณ์ว่าจะสลับหน้าดังนั้นถ้าเป็นเช่นนั้นจะต้องเก็บอย่างอื่นไว้บน RAM จึงเป็นการปรับปรุงประสิทธิภาพ" - ฉันคิดว่าถ้อยคำนี้ค่อนข้างคลุมเครือ เคอร์เนลจะเขียนหน้าเพื่อแลกเปลี่ยนอย่างแน่นอนทุกครั้งที่มีโอกาส (เช่นมี I / O ของดิสก์น้อย) อย่างไรก็ตามจะไม่ลบออกจาก RAM ด้วยวิธีนี้คุณจะได้สิ่งที่ดีที่สุดทั้งสองโลก: หากคุณต้องการหน้าเหล่านั้นอีกครั้งอย่างรวดเร็วพวกเขาอยู่ใน RAM แล้วและไม่มีอะไรให้ทำ หากเกิดเหตุฉุกเฉิน (ตามที่ OP กำหนดไว้) คุณเพียงแค่เพิ่มหน้าเว็บเหล่านั้นใน RAM เพราะ
Jörg W Mittag

3
…พวกเขากำลังแลกเปลี่ยนกันอยู่แล้ว และนั่นคือเหตุผลที่คุณไม่ต้องการใช้ swap "เฉพาะในกรณีฉุกเฉิน" เนื่องจากในระหว่างเกิดเหตุฉุกเฉินระบบอยู่ภายใต้ความเครียดและสิ่งสุดท้ายที่คุณต้องการคือการเพิ่มดิสก์ I / O จำนวนมาก
Jörg W Mittag

2
สิ่งที่ทำให้การสลับออกน่าจะเป็นกระบวนการที่ใช้เวลานานนั่นคือการเข้าถึงไฟล์บนดิสก์ ไฟล์เหล่านั้นในหน่วยความจำจะถูกใช้งานมากกว่าหน่วยความจำของ GUI
jpmc26

3
@ JörgWMittagคุณมีหลักฐานว่าเคอร์เนล Linux คือเมื่อการใช้งาน I / O ต่ำการเขียนเพจไปยังพื้นที่สว็อปล่วงหน้า "ในกรณี" คือกล่าวโดยไม่ต้องพ้นจากแรมหรือไม่
jlliagre

10

เป็นกระบวนการที่คุณใช้งานบางสิ่งที่คุณสร้างขึ้นเองหรือไม่?

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

ลองย่อขนาดแคชผลกระทบของ I / O ไปและกลับจากไฟล์นี้ โดยทั่วไปจะทำให้ประสิทธิภาพลดลง แต่มีประโยชน์ในสถานการณ์พิเศษเช่นเมื่อแอปพลิเคชันทำการแคชของตัวเอง ไฟล์ I / O ทำโดยตรงไปยัง / จากบัฟเฟอร์พื้นที่ผู้ใช้ การตั้งค่าสถานะ O_DIRECT ด้วยตนเองพยายามถ่ายโอนข้อมูลแบบซิงโครนัส แต่ไม่ให้การรับประกันของการตั้งค่าสถานะ O_SYNC ว่าข้อมูลและข้อมูลเมตาที่จำเป็นจะถูกถ่ายโอน ในการรับประกัน I / O แบบซิงโครนัสจะต้องใช้ O_SYNC นอกเหนือจาก O_DIRECT ดูหมายเหตุด้านล่างสำหรับการสนทนาเพิ่มเติม


1
อีกอันที่คล้ายกัน (แต่อาจจะง่ายกว่านี้เพราะฉันค่อนข้างมั่นใจว่า O_DIRECT มีข้อ จำกัด การจัดตำแหน่งและคุณจะฆ่าประสิทธิภาพหากการอ่านของคุณไม่ใหญ่) เป็นข้อสรุปที่จะบอกเคอร์เนลว่าคุณไม่ต้องการข้อมูลนั้นอีกแล้ว แคชหน้า (ทางโทรศัพท์หรือจะให้ลิงก์ขออภัย)
derobert

1
@derobert หนึ่งnocacheคำสั่งคือแฮ็คที่สะดวกในการทำเช่นนี้ (ใช้ LD_PRELOAD เพื่อจี้สาย libc บางสาย)
sourcejedi

6

นี่คือความคิดที่ฉันไม่ได้ลองด้วยตัวเอง (และฉันขอโทษฉันยังไม่มีเวลาที่จะทดลองกับสิ่งนี้)

สมมติว่าคุณสร้าง VM ขนาดเล็กที่มีหน่วยความจำเพียง 512MB สำหรับกระบวนการพื้นหลังของคุณฉันไม่แน่ใจว่าคุณต้องการให้มีการแลกเปลี่ยนการโทรและการปิดการแลกเปลี่ยนในระบบโฮสต์ของคุณหรือไม่


3

ลบ swap หรือลดขนาดมันลงประมาณ 20% ( อาจแตกต่างกันไปตามระบบ ) เนื่องจากเมื่อเร็ว ๆ นี้ OS ไม่ได้ใช้ swap อีกต่อไปเช่นเดียวกับที่เคยทำเมื่อไม่กี่ปีที่ผ่านมา มันอาจตอบคำถามของคุณ:

-> redhat.com อย่างเป็นทางการ

ข้อมูล Red Hat บางส่วนด้านล่าง

ในอดีตผู้ขายแอปพลิเคชันบางรายแนะนำให้สลับขนาดเท่ากับ RAM หรือแม้แต่สองเท่าของ RAM ตอนนี้ให้เราจินตนาการถึงระบบดังกล่าวข้างต้นที่มี 2GB RAM และ 2GB swap ฐานข้อมูลในระบบมีการกำหนดค่าโดยผิดพลาดสำหรับระบบที่มี RAM 5GB เมื่อหน่วยความจำกายภาพถูกใช้หมด swap จะถูกใช้ เนื่องจาก swap disk นั้นช้ากว่า RAM มากประสิทธิภาพจะลดลงและเกิดการฟาด ณ จุดนี้การล็อกอินเข้าสู่ระบบอาจเป็นไปไม่ได้ เมื่อหน่วยความจำได้รับการเขียนเพิ่มมากขึ้นในที่สุดทั้งหน่วยความจำแบบกายภาพและหน่วยความจำ swap จะหมดลงอย่างสมบูรณ์และนักฆ่า OOM เตะเข้าฆ่ากระบวนการอย่างน้อยหนึ่งกระบวนการ ในกรณีของเรามีการแลกเปลี่ยนค่อนข้างมากดังนั้นเวลาของประสิทธิภาพที่ไม่ดีจึงยาวนาน

และ

https://wiki.debian.org/Swap

ส่วนของลิงก์ Debian ด้านบน

ข้อมูลและข้อควรพิจารณาที่เกี่ยวข้องกับปริมาณการแลกเปลี่ยนที่จะใช้:

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

คุณอาจลอง:

"วิธีที่ดีที่สุดในการปิดการใช้งาน swap ใน linux"


บันทึกส่วนตัว:


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


1
ในอดีตผู้ขายแอปพลิเคชันบางรายแนะนำให้สลับขนาดเท่ากับ RAM หรือแม้แต่สองเท่าของ RAM ฉันรู้สึกแก่กว่ามากที่เห็นว่าอย่างใด ... แม้ว่าฉันจะยังมีหนึ่งใน HDD ที่อุปสรรค ~ 528MB และ 2.5GB แต่อย่างใดที่อ้าง - ดีมันเป็นบางสิ่งบางอย่างจากนานมาแล้ว ... อ้างที่น่าสนใจแม้ว่าและ มันอาจอธิบายได้ว่าทำไมฉันเห็นปัญหาที่คล้ายกันเมื่อไม่กี่ปีที่ผ่านมา ฉันเชื่อว่าฉันใช้ sysctl เพื่อแก้ไข แต่ฉันจำไม่ได้ว่าการตั้งค่าใดถ้ามันเป็นวันก่อน
Pryftan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.