Meningkatkan kinerja cache disk secara umum lebih dari sekedar meningkatkan ukuran cache sistem file kecuali jika seluruh sistem Anda cocok dengan RAM dalam hal ini Anda harus menggunakan drive RAM ( tmpfs
bagus karena memungkinkan jatuh kembali ke disk jika Anda membutuhkan RAM dalam beberapa kasus) untuk penyimpanan runtime (dan mungkin skrip initrd untuk menyalin sistem dari penyimpanan ke drive RAM saat startup).
Anda tidak memberi tahu apakah perangkat penyimpanan Anda adalah SSD atau HDD. Inilah yang saya temukan bekerja untuk saya (dalam kasus saya sda
adalah HDD terpasang pada /home
dan sdb
SSD dipasang pada /
).
Pertama-tama optimalkan bagian load-stuff-from-storage-to-cache:
Ini pengaturan saya untuk HDD (pastikan AHCI + NCQ diaktifkan di BIOS jika Anda memiliki matikan):
echo cfq > /sys/block/sda/queue/scheduler
echo 10000 > /sys/block/sda/queue/iosched/fifo_expire_async
echo 250 > /sys/block/sda/queue/iosched/fifo_expire_sync
echo 80 > /sys/block/sda/queue/iosched/slice_async
echo 1 > /sys/block/sda/queue/iosched/low_latency
echo 6 > /sys/block/sda/queue/iosched/quantum
echo 5 > /sys/block/sda/queue/iosched/slice_async_rq
echo 3 > /sys/block/sda/queue/iosched/slice_idle
echo 100 > /sys/block/sda/queue/iosched/slice_sync
hdparm -q -M 254 /dev/sda
Perlu dicatat untuk kasus HDD tinggi fifo_expire_async
(biasanya menulis) dan panjang slice_sync
untuk memungkinkan satu proses mendapatkan throughput tinggi (diatur slice_sync
ke angka yang lebih rendah jika Anda menekan situasi di mana beberapa proses menunggu beberapa data dari disk secara paralel). Itu slice_idle
selalu merupakan kompromi untuk HDD tetapi pengaturannya di suatu tempat dalam kisaran 3-20 akan baik-baik saja tergantung pada penggunaan disk dan firmware disk. Saya lebih suka menargetkan nilai rendah tetapi pengaturan terlalu rendah akan merusak throughput Anda. The quantum
pengaturan tampaknya mempengaruhi throughput yang banyak tapi mencoba untuk menjaga ini serendah mungkin untuk menjaga latency pada tingkat yang masuk akal. Pengaturan yang quantum
terlalu rendah akan merusak throughput. Nilai dalam kisaran 3-8 tampaknya berfungsi baik dengan HDD. Latensi kasus terburuk untuk dibaca adalah ( quantum
* slice_sync
) + ( slice_async_rq
*slice_async
) ms jika saya memahami perilaku kernel dengan benar. Async sebagian besar digunakan oleh menulis dan karena Anda bersedia menunda menulis ke disk, atur keduanya slice_async_rq
dan slice_async
ke angka yang sangat rendah. Namun, pengaturan slice_async_rq
nilai yang terlalu rendah dapat menghentikan bacaan karena menulis tidak dapat ditunda setelah membaca lagi. Konfigurasi saya akan mencoba untuk menulis data ke disk paling setelah 10 detik setelah data telah diteruskan ke kernel tapi karena Anda dapat mentolerir hilangnya data pada penurunan daya juga mengatur fifo_expire_async
untuk 3600000
memberitahu bahwa 1 jam apa-apa untuk penundaan ke disk. Tetap slice_async
rendah, karena jika tidak, Anda bisa mendapatkan latensi baca yang tinggi.
The hdparm
perintah diperlukan untuk mencegah AAM dari membunuh banyak kinerja yang AHCI + NCQ memungkinkan. Jika disk Anda mengeluarkan terlalu banyak suara, lewati saja ini.
Ini pengaturan saya untuk SSD (Intel 320 series):
echo cfq > /sys/block/sdb/queue/scheduler
echo 1 > /sys/block/sdb/queue/iosched/back_seek_penalty
echo 10000 > /sys/block/sdb/queue/iosched/fifo_expire_async
echo 20 > /sys/block/sdb/queue/iosched/fifo_expire_sync
echo 1 > /sys/block/sdb/queue/iosched/low_latency
echo 6 > /sys/block/sdb/queue/iosched/quantum
echo 2 > /sys/block/sdb/queue/iosched/slice_async
echo 10 > /sys/block/sdb/queue/iosched/slice_async_rq
echo 1 > /sys/block/sdb/queue/iosched/slice_idle
echo 20 > /sys/block/sdb/queue/iosched/slice_sync
Di sini perlu diperhatikan nilai rendah untuk pengaturan slice yang berbeda. Pengaturan paling penting untuk SSD adalah slice_idle
yang harus diatur ke 0-1. Mengaturnya ke nol memindahkan semua keputusan pemesanan ke NCQ asli sementara mengaturnya ke 1 memungkinkan kernel untuk memesan permintaan (tetapi jika NCQ aktif, perangkat keras dapat menimpa pemesanan kernel sebagian). Uji kedua nilai untuk melihat apakah Anda dapat melihat perbedaannya. Untuk Intel 320 series, tampaknya pengaturan slide_idle
untuk 0
memberikan throughput terbaik tetapi pengaturan untuk 1
memberikan latensi keseluruhan terbaik (terendah).
Untuk informasi lebih lanjut tentang merdu ini, lihat http://www.linux-mag.com/id/7572/ .
Sekarang kita telah mengkonfigurasi kernel untuk memuat hal-hal dari disk ke cache dengan kinerja yang masuk akal, saatnya untuk menyesuaikan perilaku cache:
Menurut tolok ukur yang telah saya lakukan, saya tidak akan repot mengatur baca depan blockdev
sama sekali. Pengaturan default kernel baik-baik saja.
Atur sistem untuk lebih suka menukar data file dengan kode aplikasi (ini tidak masalah jika Anda memiliki cukup RAM untuk menyimpan seluruh sistem file dan semua kode aplikasi dan semua memori virtual yang dialokasikan oleh aplikasi dalam RAM). Ini mengurangi latensi untuk bertukar di antara berbagai aplikasi melebihi latensi untuk mengakses file besar dari satu aplikasi:
echo 15 > /proc/sys/vm/swappiness
Jika Anda lebih suka menyimpan aplikasi hampir selalu dalam RAM, Anda dapat mengatur ini ke 1. Jika Anda menetapkan ini ke nol, kernel tidak akan bertukar sama sekali kecuali benar-benar diperlukan untuk menghindari OOM. Jika memori Anda terbatas dan bekerja dengan file besar (mis. Mengedit video HD), maka mungkin masuk akal untuk mengatur ini mendekati 100.
Saya saat ini (2017) lebih suka tidak memiliki swap sama sekali jika Anda memiliki cukup RAM. Tanpa swap biasanya akan kehilangan 200-1000 MB RAM pada mesin desktop yang berjalan lama. Saya rela berkorban banyak untuk menghindari latensi skenario terburuk (menukar kode aplikasi ketika RAM penuh). Dalam prakteknya, ini berarti saya lebih suka OOM Killer daripada bertukar. Jika Anda mengizinkan / perlu bertukar, Anda mungkin ingin menambah /proc/sys/vm/watermark_scale_factor
juga, untuk menghindari latensi. Saya akan menyarankan nilai antara 100 dan 500. Anda dapat mempertimbangkan pengaturan ini sebagai perdagangan penggunaan CPU untuk latensi swap yang lebih rendah. Default adalah 10 dan maksimum yang mungkin adalah 1000. Nilai yang lebih tinggi harus (sesuai dengan dokumentasi kernel ) menghasilkan penggunaan CPU yang lebih tinggi untuk kswapd
proses dan latensi swapping keseluruhan yang lebih rendah.
Selanjutnya, beri tahu kernel untuk lebih memilih menjaga hierarki direktori dalam memori daripada konten file jika beberapa RAM perlu dibebaskan (sekali lagi, jika semuanya sesuai dalam RAM, pengaturan ini tidak melakukan apa-apa):
echo 10 > /proc/sys/vm/vfs_cache_pressure
Pengaturan vfs_cache_pressure
nilai rendah masuk akal karena dalam kebanyakan kasus, kernel perlu mengetahui struktur direktori sebelum dapat menggunakan konten file dari cache dan membilas cache direktori terlalu cepat akan membuat cache file di samping tidak berharga. Pertimbangkan untuk turun ke 1 dengan pengaturan ini jika Anda memiliki banyak file kecil (sistem saya memiliki sekitar 150 ribu foto 10 megapiksel dan dianggap sebagai sistem "banyak file kecil"). Jangan pernah atur ke nol atau struktur direktori selalu disimpan dalam memori meskipun sistem kehabisan memori. Mengatur ini ke nilai besar masuk akal hanya jika Anda hanya memiliki beberapa file besar yang terus-menerus dibaca kembali (sekali lagi, pengeditan video HD tanpa cukup RAM akan menjadi contoh kasus). Dokumentasi kernel resmi mengatakan bahwa "
Pengecualian: jika Anda memiliki jumlah file dan direktori yang sangat besar dan Anda jarang menyentuh / membaca / membuat daftar semua file dengan pengaturan vfs_cache_pressure
lebih tinggi dari 100 mungkin bijaksana. Ini hanya berlaku jika Anda tidak memiliki RAM yang cukup dan tidak dapat menyimpan seluruh struktur direktori dalam RAM dan masih memiliki cukup RAM untuk cache dan proses file normal (misalnya server file perusahaan dengan banyak konten arsip). Jika Anda merasa perlu menambah di vfs_cache_pressure
atas 100, Anda berjalan tanpa RAM yang cukup. Meningkatkan vfs_cache_pressure
mungkin membantu tetapi satu-satunya perbaikan nyata adalah untuk mendapatkan lebih banyak RAM. Setelah vfs_cache_pressure
ditetapkan ke angka tinggi mengorbankan kinerja rata-rata untuk memiliki kinerja yang lebih stabil secara keseluruhan (yaitu, Anda dapat menghindari perilaku kasus terburuk yang sangat buruk tetapi harus berurusan dengan kinerja keseluruhan yang lebih buruk).
Terakhir, suruh kernel untuk menggunakan hingga 99% dari RAM sebagai cache untuk menulis dan memerintahkan kernel untuk menggunakan hingga 50% dari RAM sebelum memperlambat proses penulisan (default for dirty_background_ratio
is 10
). Peringatan: Saya pribadi tidak akan melakukan ini tetapi Anda mengaku memiliki cukup RAM dan bersedia kehilangan data.
echo 99 > /proc/sys/vm/dirty_ratio
echo 50 > /proc/sys/vm/dirty_background_ratio
Dan katakan bahwa penundaan penulisan 1 jam tidak masalah bahkan untuk mulai menulis hal-hal pada disk (sekali lagi, saya tidak akan melakukan ini):
echo 360000 > /proc/sys/vm/dirty_expire_centisecs
echo 360000 > /proc/sys/vm/dirty_writeback_centisecs
Jika Anda meletakkan semua itu /etc/rc.local
dan menyertakan berikut di akhir, semuanya akan ada dalam cache sesegera mungkin setelah boot (hanya lakukan ini jika filesystem Anda benar-benar sesuai dengan RAM):
(nice find / -type f -and -not -path '/sys/*' -and -not -path '/proc/*' -print0 2>/dev/null | nice ionice -c 3 wc -l --files0-from - > /dev/null)&
Atau alternatif yang sedikit lebih sederhana yang mungkin bekerja lebih baik (hanya cache /home
dan /usr
, lakukan ini hanya jika Anda benar /home
- /usr
benar sesuai dengan RAM):
(nice find /home /usr -type f -print0 | nice ionice -c 3 wc -l --files0-from - > /dev/null)&