GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara menggunakan ruang swap hanya untuk keadaan darurat?

Salah satu perbaikannya adalah memastikan pengontrol cgroup memori diaktifkan (saya pikir ini secara default bahkan di kernel yang setengah baru, jika tidak, Anda harus menambahkan cgroup_enable=memory ke baris perintah kernel). Kemudian Anda dapat menjalankan tugas intensif I/O di cgroup dengan batas memori, yang juga membatasi jumlah cache yang dapat digunakan.

Jika Anda menggunakan systemd, Anda dapat menyetel +MemoryAccounting=yes dan MemoryHigh /MemoryMax atau MemoryLimit (tergantung pada apakah Anda menggunakan cgroup v1 atau v2) di unit, atau potongan yang memuatnya. Jika berupa slice, Anda dapat menggunakan systemd-run untuk menjalankan program di dalam slice.

Contoh lengkap dari salah satu sistem saya untuk menjalankan Firefox dengan batas memori. Perhatikan ini menggunakan cgroups v2 dan diatur sebagai pengguna saya, bukan root (salah satu keuntungan v2 dibandingkan v1 adalah mendelegasikan ini ke non-root aman, jadi systemd melakukannya).

$ 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 &

Saya menemukan untuk membuat pengguna bekerja, saya harus menggunakan irisan. Sistem satu berfungsi hanya dengan meletakkan opsi di file layanan (atau menggunakan systemctl set-property pada layanan).

Ini adalah contoh layanan (menggunakan cgroup v1), perhatikan dua baris terakhir. Ini adalah bagian dari contoh sistem (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

Dokumentasi ada di systemd.resource-control(5) .


Tampaknya setelah seharian tidak aktif, kernel percaya bahwa seluruh GUI tidak lagi diperlukan dan menghapusnya dari RAM (menukarnya ke disk).

Kernel melakukan Hal yang Benar™ mempercayainya. Mengapa itu menyimpan memori yang tidak terpakai dalam RAM dan pada dasarnya menyia-nyiakannya alih-alih menggunakannya sebagai cache atau semacamnya?

Saya tidak berpikir kernel Linux secara serampangan atau antisipatif menukar halaman, jadi jika itu terjadi, itu pasti untuk menyimpan sesuatu yang lain di RAM, sehingga meningkatkan kinerja tugas Anda yang berjalan lama, atau setidaknya dengan tujuan ini.

Jika sebelumnya Anda tahu kapan harus menggunakan kembali laptop, Anda dapat menggunakan at perintah (atau crontab ) untuk menjadwalkan pembersihan swap (swapoff -a;swapon -a ).

Karena membersihkan swap mungkin berlebihan, dan bahkan memicu pembunuh OOM jika karena alasan tertentu, tidak semuanya muat di RAM, Anda mungkin hanya "membatalkan" semua yang terkait dengan aplikasi yang sedang berjalan yang ingin Anda aktifkan kembali.

Salah satu cara untuk melakukannya adalah dengan memasang debugger seperti gdb ke setiap proses yang terpengaruh dan memicu pembuatan core dump:

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

Seperti yang Anda tulis, aplikasi Anda yang berjalan lama tidak menggunakan kembali data yang dibacanya setelah proses awal, jadi Anda berada dalam kasus tertentu di mana caching jangka panjang tidak berguna. Kemudian melewati cache dengan menggunakan I/O langsung seperti yang disarankan oleh Will Crawford seharusnya menjadi solusi yang baik.

Alternatifnya, Anda mungkin hanya membersihkan cache file secara teratur dengan menggemakan 1 atau 3 ke /proc/sys/vm/drop_caches pseudo-file sebelum OS berpikir bahwa menukar aplikasi dan lingkungan GUI Anda adalah ide yang bagus.

Lihat Bagaimana Anda mengosongkan buffer dan cache pada sistem Linux? untuk detailnya.

Tidak digunakan dalam artian:tidak lagi digunakan secara aktif sejak jangka waktu yang cukup lama, memori masih relevan bagi pemiliknya.
Masukkan kembali halaman RAM yang disimpan di area swap.


Memiliki pertukaran yang begitu besar saat ini seringkali merupakan ide yang buruk. Pada saat OS menukar hanya beberapa GB memori untuk ditukar, sistem Anda telah merayap sampai mati (seperti yang Anda lihat)

Sebaiknya gunakan zram dengan partisi swap cadangan kecil . Banyak OS seperti ChromeOS, Android, dan berbagai distro Linux (Lubuntu, Fedora) telah mengaktifkan zram secara default selama bertahun-tahun, terutama untuk sistem dengan RAM lebih sedikit. Ini jauh lebih cepat daripada menukar HDD dan Anda dapat dengan jelas merasakan respons sistem dalam hal ini. Kurang begitu pada SSD, tetapi menurut hasil benchmark di sini masih terlihat lebih cepat bahkan dengan algoritme default lzo. Anda dapat mengubah ke lz4 untuk kinerja yang lebih baik dengan rasio kompresi yang sedikit lebih rendah. Kecepatan decoding-nya hampir 5 kali lebih cepat daripada lzo berdasarkan tolok ukur resmi

Bahkan Windows 10 dan macOS juga menggunakan teknik kompresi pagefile serupa secara default

Ada juga zswap padahal saya belum pernah pakai. Mungkin patut dicoba dan bandingkan mana yang lebih baik untuk kasus penggunaan Anda

Setelah itu, saran lainnya adalah mengurangi prioritas proses yang terikat IO tersebut dan mungkin membiarkan terminal berjalan pada prioritas yang lebih tinggi sehingga Anda dapat langsung menjalankan perintah bahkan ketika sistem sedang dalam beban tinggi

Bacaan lebih lanjut

  • Arch Linux - Meningkatkan kinerja - Zram atau zswap
  • Aktifkan ZSwap untuk meningkatkan kinerja
  • Aktifkan zRAM untuk penanganan memori yang lebih baik dan lebih sedikit pertukaran
  • Kehabisan RAM di Ubuntu? Aktifkan ZRAM
  • Perbedaan antara ZRAM dan ZSWAP
  • Panduan utama zram vs zswap vs zcache:kapan harus menggunakan yang mana
  • Linux, SSD, dan tukar
  • https://wiki.debian.org/ZRam
  • https://www.kernel.org/doc/Documentation/blockdev/zram.txt
  • https://wiki.gentoo.org/wiki/Zram

Linux
  1. Bagaimana saya menggunakan Ansible dan anacron untuk otomatisasi

  2. Cara Membuat Atau Menambah Ruang Swap Di Linux

  3. Cara Menambahkan Ruang Swap di Ubuntu 22.04

  1. Cara menggunakan perintah sed Linux

  2. Berapa Banyak Ruang Tukar untuk Ditambahkan untuk Oracle Database di Linux

  3. Bagaimana cara menambahkan ruang swap di linux

  1. Cara menggunakan rsync lanjutan untuk cadangan Linux besar

  2. Cara menggunakan systemd-nspawn untuk pemulihan sistem Linux

  3. Linux – Bagaimana Cara Menggunakan Ruang Swap Untuk Keadaan Darurat Saja?