Penggunaan O_DIRECT di Linux

23

Jika pertanyaan ini terlalu berorientasi pada programmer, beri tahu saya. Saya ingin tahu apakah ada orang yang terbiasa dengan flag O_DIRECT untuk pemanggilan sistem open () di Linux 2.6? Linus meremehkan penggunaannya, namun penulisan file berkinerja tinggi tampaknya mengindikasikan penggunaannya. Saya ingin mengetahui pengalaman dan rekomendasi dunia nyata.

Info lebih lanjut: Aplikasi yang saya gunakan memang mempertahankan cache sendiri, dan dengan demikian mencapai rata-rata 5x atau lebih mempercepat. Saat menulis ke file, isi cache harus dituliskan ke cache sistem file, yang tampaknya berlebihan dan menjadi masalah kinerja.

casualunixer
sumber

Jawaban:

17

Ok, Anda minta pengalaman, ini membuat pertanyaannya sedikit subjektif dan argumentatif, tapi lumayan.

Linus mengatakan bahwa merujuk pada penggunaan yang biasanya dikaitkan orang dengan O_DIRECT, dan untuk penggunaan itu, IMO Linus sebagian besar benar. Bahkan jika Anda melakukan I / O langsung, Anda tidak dapat mentransfer data ke / dari perangkat langsung ke pernyataan program Anda, Anda memerlukan buffer yang diisi (oleh program atau perangkat) dan ditransfer melalui panggilan sistem ke ujung lainnya. Juga, untuk membuatnya efisien, Anda tidak ingin membaca ulang sesuatu yang baru saja Anda baca, jika Anda membutuhkannya lagi. Jadi, Anda memerlukan semacam cache ... dan itu persisnya yang disediakan kernel tanpa O_DIRECT, cache halaman! Kenapa tidak menggunakannya? Itu juga datang dengan manfaat jika lebih banyak proses ingin mengakses file yang sama secara bersamaan, itu akan menjadi bencana dengan O_DIRECT.

Karena itu, O_DIRECT memiliki kegunaannya: Jika karena alasan tertentu Anda perlu mendapatkan data langsung dari perangkat blok. Itu tidak ada hubungannya dengan kinerja.

Orang-orang yang menggunakan O_DIRECT untuk kinerja biasanya berasal dari sistem dengan algoritma cache halaman yang buruk, atau tanpa mekanisme saran POSIX, atau bahkan orang-orang yang dengan ceroboh mengulangi apa yang dikatakan orang lain. Untuk menghindari masalah ini, O_DIRECT adalah solusinya. Linux, OTOH, memiliki filosofi bahwa Anda harus memperbaiki masalah mendasar yang sebenarnya, dan masalah mendasarnya adalah OS yang melakukan pekerjaan buruk dengan caching halaman.

Saya menggunakan O_DIRECT untuk implementasi sederhana kucing untuk menemukan kesalahan memori di mesin saya. Ini adalah salah satu penggunaan yang valid untuk O_DIRECT. Itu tidak ada hubungannya dengan kinerja.

Juliano
sumber
Terima kasih atas informasinya, ini sangat dihargai. Saya telah memperbarui pertanyaan saya dengan kondisi spesifik aplikasi yang mendorong pertanyaan ini. Jika Anda memiliki rincian lebih lanjut tentang mekanisme saran POSIX untuk menulis file, itu akan dihargai juga.
casualunixer
4
o_direct mungkin juga berguna dalam sistem di mana pengembang ingin menyediakan mekanisme caching di lapisan aplikasi (pikirkan database).
Jmoney38
Itu tidak ada hubungannya dengan kinerja. Itu tidak selalu benar, terutama untuk mengakses perangkat berkecepatan tinggi di mana IO menilai bandwidth memory saingan, atau bahkan hanya persentase bandwidth memory yang signifikan. Dalam hal ini, melewatkan salinan tambahan ke / dari cache halaman dapat memiliki manfaat kinerja yang signifikan.
Andrew Henle
13

Sebenarnya, O_DIRECT ini diperlukan untuk menghindari salah satu dari

  • cache cache - kadang-kadang Anda tahu bahwa overhead dengan caching tidak masuk akal, misalnya ketika berhadapan dengan file yang sangat besar, katakan 64 GiB ketika hanya ada 2 GiB RAM. File torrent 32 GiB yang pengguna putuskan untuk verifikasi sepertinya bukan kandidat yang baik untuk caching. Itu hanya aktivitas ekstra dengan overhead sendiri. Dan itu dapat menyebabkan beberapa data yang sangat berguna dipangkas dari cache.
  • caching ganda - misalnya untuk beberapa RDBMS (untuk menyebutkan MySQL) memungkinkan untuk mendefinisikan cache sendiri. Database seharusnya tahu lebih baik bagaimana cara cache dan apa, dari Memori Virtual kernel yang tidak tahu apa-apa tentang perencanaan SQL dan sebagainya.

- yang tidak baik, seperti yang terlihat. Dan O_DIRECTtidak berarti lebih cepat, sering kali tidak .

poige
sumber
10
posix_fadvisedapat mengatasi masalah polusi cache.
psusi
Saya tidak berpikir Virtual Memory ada hubungannya dengan itu, itu hanya memetakan alamat memori. Cache Buffer / Cache Halaman adalah yang Anda maksud.
ArekBulski
Cache / caching adalah bagian dari subsistem VM di UNIX, sejauh yang saya tahu, itu sebabnya saya menggunakan istilah ini. Terima kasih sudah mengedit. :)
poige
6

Perhatikan bahwa menggunakan O_DIRECTkemungkinan gagal di kernel yang lebih baru dengan sistem file yang lebih baru. Lihat laporan bug ini misalnya. Jadi tidak hanya penggunaannya yang sering meragukan, kemungkinan tidak akan berfungsi sama sekali pada generasi distribusi Linux yang akan datang. Jadi saya tidak akan bertaruh kinerja kode saya di atasnya, bahkan jika Anda dapat membuktikan bahwa itu mungkin memiliki manfaat.

Peter Eisentraut
sumber
1
Laporan bug sebenarnya membahas penggunaan sistem file dengan opsi jurnal = data aktif. Opsi ini berbanding terbalik dengan bendera O_DIRECT. Kebanyakan filesystem ext3 dan ext4 tidak memiliki flag ini dan jika mereka melakukannya, mematikannya akan memungkinkan membuka file dengan O_DIRECT.
casualunixer
3

Ini banyak hubungannya dengan kinerja.

Contoh yang menarik adalah di mongodb menggunakan mesin mmap. O_DIRECT paling baik digunakan, seperti yang orang lain nyatakan, di mana data tidak mungkin dibaca untuk beberapa waktu. Dalam mongodb, jurnal basis data ditulis menggunakan O_DIRECT sedangkan penulisan data dan indeks ditangani oleh mekanisme cache halaman (pdflush) karena, meskipun O_DIRECT menawarkan lebih sedikit bandwidth, itu juga berarti lebih sedikit latensi, dan karenanya mengurangi kehilangan data jika terjadi pemadaman yang tak terduga (kernel panik, disk atau listrik mati). Perhatikan bahwa masih ada buffering sebelum penulisan O_DIRECT berkomitmen untuk penyimpanan non-volatil, ini hanya mengurangi kehilangan data.

Fitur penting lainnya dari O_DIRECT adalah ia memberikan kontrol lebih besar atas urutan penulisan. Sekali lagi itu tidak menjamin urutan penulisan (kecuali Anda memiliki pengontrol caching disk yang tidak mudah menguap dan menggunakan penjadwal fifo, tetapi ini memiliki komplikasinya sendiri). Oleh karena itu walaupun mysql menggunakan O_DIRECT untuk data / indeks dan juga penjurnalannya, ia dapat berharap bahwa yang terakhir biasanya akan dikomit terlebih dahulu.

Tetapi penting untuk diingat bahwa O_DIRECT merusak keadilan dalam alokasi sumber daya. Salah satu alasan aplikasi Anda dipercepat adalah karena memperlambat hal-hal lain.

symcbean
sumber
Anda mengatakan itu banyak berhubungan dengan kinerja, namun, Anda memberikan contoh di mana ia digunakan baik untuk mengurangi latensi atau perintah menulis. Tetapi saya setuju bahwa itu mempengaruhi kinerja. Poin yang adil tentang keadilan.
ArekBulski
Bisakah Anda memberikan lebih banyak referensi menjelaskan ketika itu tidak adil?
ACyclic
3

Berkaitan dengan apa yang sudah dikatakan @Juliano.

Checkout posix_fadvisejika masalah sebenarnya adalah perilaku yang salah dari algoritma cache sistem file yang mendasarinya, Anda dapat mencoba memberikan saran, bagaimana Anda akan menggunakan sistem file. Untuk fs yang diterapkan dengan baik, harus memberikan peningkatan kinerja. (Berikut ini tautan ke topik lain yang menyentuh pertimbangan serupa /programming//a/3755818/544721 )

Grzegorz Wierzowiecki
sumber
1
Sepertinya posix_fadvise mengubah algoritma readahead yang digunakan oleh kernel. Faktor kritis dengan kode dalam pertanyaan adalah kinerja menulis. Masalahnya adalah bahwa menulis buffer mengisi cache Linux terlebih dahulu, yang kemudian harus dibuang oleh kernel saat kehabisan memori. Ini adalah usaha yang sia-sia, output dalam kasus ini harus minimal buffered dalam perjalanan ke disk.
casualunixer