Linux Kernel 3.0以降について調べてみた(I/O周り)

I/Oだけでかなりの量になったので分割
ext4,xfs,nfsをさらに充実させる予定

仮想化周りは除外しております。
重要そうなのは太字

現在3.11まで調査完了

#共通
##3.0 hole punching(ext4) 3.5 (tmpfs) 3.19 (NFS)
MySQL5.7のInnodb compressionとかで使うSSDのデータ圧縮
CentOS6はバックポートされている模様
###3.1 CFQ I/O scheduler: performance tuning
スケジューラのCFQの性能向上
##3.1 Dynamic writeback throttling
ライトバックの最適化
プロセスを抑制するべきかを決めるヒューリスティックを改善
ライトスルー(HDDに確実に書き込み)させなくていい環境であれば効果が期待できる
##3.2 I/O-less dirty throttling, reduce filesystem writeback from page reclaim
ライトバックアルゴリズムの改善
ロックの競合と同時IO負荷でのキャッシュバウンスを大幅に改善
ページ・リカバリからのファイル・システム・ライトバックを減らす
ライトスルー(HDDに確実に書き込み)させなくていい環境であれば効果が期待できる
###3.7 Implement support for the WRITE SAME command supported on some SCSI devices
WRITE SAMEコマンドのサポートでゼロフィル、ファイル消去の高速化
###3.11 常にinode更新されているファイルシステムのファイルオープンを7～8倍高速化
???バージョンが違うようなので後で調査
##4.0 "lazytime" option for better update of file timestamps
タイムスタンプの処理でlazytimeのサポート
**更新が多いシステムで効果が期待できる**
atimeオプションの完全な代用になりうるPOSIX準拠のlazytimeをサポート
relatimeでは正確なアクセス時間の追跡に頼っているプログラムで問題があったため
dirtytime_expire_intervalというsysctlパラメータも追加
##4.4 Faster and leaner loop device with Direct I/O and Asynchronous I/O support
ループブロックデバイスにおけるDirect I/Oや非同期I/Oサポート
imgファイルをマウントするときに早くなった模様
##4.5 Better epoll multithread scalability
マルチスレッドにおけるepoll改良
大量にファイルを開くnginxなどに有効かな
##4.7 tmpfsの改良
???バージョンが違うようなので後で調査
4k以上のページを一度に扱えるようになった
##4.8 Support for using Transparent Huge Pages in the page cache
ページキャッシュに透明な巨大ページを使用するためのサポート
mountオプションhuge=でtmpfsのhugepage割り当てポリシーを制御可能に
###4.13 Improved block layer and background writes error handling
バッググラウンド書き込みプロセスが失敗しても初回しかエラーが出さなかったが
エラーを新しい処理にしfsyncで信頼性の高いレポートエラーが出るようになった
#SSD
##3.9 SSDによるキャッシュ"dm-cache"、3.10　"bcache"
HDDより早いSSDでキャッシュするシステム
この2つどうも似たようなものの様子
3.11でbcacheのRAID5/6への最適化
ディストリビューションによって資料が多い方を選ぶかベンチをきちんと取ろう
##3.16 A scalable block layer for high performance SSD storage
SSDの性能を改善するblk-mq
**SSDならそれなりに効果がある模様**
GRUBにてカーネルオプションに`scsi_mod.use_blk_mq=y`
/proc/cmdlineで有効か確認可能。
=1と=yと資料があるがmultiqueueパッチからだとyで判定している
3.18のmultiqueueのサポートはこれが前提
##3.18 Optional multiqueue SCSI support
multiqueueのサポート
3.13で実装していたのだがドライバのサポートがまだだったのでSCSI(ATA/SATA)に対応
###4.4 LightNVM adds support for Open-Channel SSDs
OSで効率的なデータの配置、ガベージコレクション、および並列処理を管理できようになる。
今まではSSD側のファームウェアで行っていた。
後NVMeのサポートも追加
###4.8 Add a generic NVMe over Fabrics library
NVMeターゲットのサポート
NVMe 1.2.1仕様に準拠し、ファブリックのホスト実装で運用可能
###4.10 Hybrid block polling
NVMe用の割り込みスリープ遅延を実装
4.4で実験的実装だったもの
/sys/block/<dev>/queue/io_poll_delay
で-1だと今までのpoll(デフォルト)、0でスリープ遅延有効、>0でさらに遅延時間を固定
###4.11 Support for OPAL drives
SEDなどの暗号化機能opal nvme対応コントローラーをLinuxから制御可能に
###4.11 Pluggable IO schedulers framework in the multiqueue block layer
プラガブルI/Oスケジューラの採用
mqで新しいmq-deadlineをサポート
###4.12 New BFQ I/O scheduler for a more reponsive desktop
低遅延、高スループット、公平性、帯域幅、遅延保証が強い。
さらにサーバではストリーミング、高速検索、リアルタイム保存
いくつかのディストリビューションでは標準サポートされている模様
実はベンチマークではボロボロ
###4.12 New Kyber I/O scheduler
マルチキューなどの高速デバイスに適した低オーバーヘッドスケジューラ
キューの深さを自己調整する
あんま言うほど効果なさげ
https://www.phoronix.com/scan.php?page=article&item=linux-412-io&num=1
###4.12 Expose OpenChannel SSDs as device blocks
kernelにSSDの効率的なデータの配置、ガベージコレクション、および並列処理をpblkでできるよう
###4.12 blk-throttle improvements
blk-mqでスケーラブルなプライオリテーションを実装する
##4.13 Asynchronous I/O improvements
Linuxでの非同期I/O実装でブロックされるケースがあったがエラーを返すように
#ext4
##3.2 ext4のブロックサイズ拡張
4KB→1MBに拡張
作成時にmkfs -Cオプションを使用して設定する必要があります（e2fsprogs 1.42が必要です）。この機能は古いカーネルと下位互換性がありません。
HDDなら効果が期待できる
###3.2 4KBの同期にてCPU消費25%削減
##3.3 ext4のオンラインリサイズの改良
オンラインでビットマップとiノードテーブルの割り当てが可能になり高速に
##3.5 ext4のメタデータに対するチェックサム
メタデータに対するチェックサムだが、ほとんど壊れた報告はない。無視できる程度のパフォーマンス低下
"tune2fs -O metadata_csum"または "mkfs -O metadata_csum"
###3.6 マウント時からquotaが自動的に有効に
###3.7 truncate/unlinkの高速化。punchingで効果
##3.8 小さなファイルのinode効率化とパフォーマンス改善
未使用のiノード空間に非常に小さなファイルを格納できるように
未使用のiノードスペースが使用され、
データブロックがファイルに割り当てられず、
これらの小さなファイルの読み取りが高速になる

ext4では一定サイズ（通常は4KB）のブロックでデータを管理しているため、数バイトのデータでも4KB分のブロックを消費してしまうことになっていた。そこで、このようなサイズの小さいファイルについては、inode内で利用されていない空間に格納することでディスク容量の無駄な消費を抑え、また読み込みパフォーマンスの向上を図るという。 

###3.14 bigallocのhole punching実装漏れの修正
###3.15 ファイルの一部の消去と消去の高速化
###4.1 DAXのサポート
###4.1 暗号化サポート
オプションではなく直接実装し既存のdm-cryptやecryptfsよりも高速に
速度とファイル、ディレクトリ単位で出来るのが特徴
やり方はここにある
http://askubuntu.com/questions/643577/how-to-create-ext4-encrypted-partition-on-ubuntu-15-04-with-new-4-1-kernel
##4.10 DAX書き込み時にダイレクトI/0にiomapを使用
既存よりもはるかに簡単で高速で、IO待ち時間は短くなる
#XFS
###3.0 オンラインdiscardサポート。要はTrimサポート
###3.1 パフォーマンスの向上
###3.7 inode64をデフォルトに変更
###3.8 ジャーナルのチェックサムサポート
###3.10 NFS4.1のファイルハンドリングをオープン毎に有効
##3.12 directory recursionのパフォーマンスが大幅に向上
###3.15 ファイルの一部の消去と消去の高速化
###4.2 DAXのサポート
###4.5 ログレコードにCRCエラーを挿入するメカニズムを追加
ログリカバリー、コミット中に破損した書き込み検出のテストを容易に
###4.6 DAXのマウントに柔軟性
DAXをマウントオプションでオン/オフできるだけでなく、ファイルシステム内の特定のパフォーマンスクリティカルなファイルに対してDAXを有効にしたい場合があるため、in-inode DAXを有効にすることができる
###4.8 iomapベースのバッファ付き書き込みパスを実装
新しいiomapベースのマルチページ書き込みパスを使用可能に
##4.9 共有データエクステント+ XFSでのコピーオンライトサポート
cp --reflink=alwaysのサポート、データの重複排除機能、およびFALLOC_FL_UNSHAREのfallocate、インターフェイスを介したデータの共有を解除する機能、データのコピーオンライトの実験的サポート
##4.10 より速いバッファ・キャッシュ・ルックアップ
ルックアップに費やされるCPU時間が、たとえ小さなものであっても1/3に減少します。
高負荷のファイルシステム効果が高い
##4.10 ダイレクトI/0にiomapを使用
既存よりもはるかに簡単で高速で、IO待ち時間は短くなる。こちらもDAXのみ？
##4.10 barrier/nobarrierマウントオプションを非推奨
常に整合性をチェックしているので不要に。オプションを使わないことを推奨
#NFS
###3.4 マウントオプションclientaddrのサポート
###3.4 マウントオプション4.0/4.1サポート
###3.7 NFS4.1の正式サポート
###3.7 マウントオプションmigrationのサポート
##4.0 NFSサーバをデフォルト4.2に
##4.0 パラレルNFSのサポート
ただしXFSのみ
###4.2 NFSv4.2 LAYOUTSTATS機能（pnfsフレックスファイル用）
##4.5 NFSサーバの高速化
実験的サポート
###4.6 NFSv3上のpNFSフレックスファイルサーバにマルチパス機能を追加
###4.10 Add support for a new NFSv4.2 mode_umask
MFSv4.2のmode_umaskをサポート
#iSCSI
##3.1 iSCSIターゲットの変更
RFC-3720のフル実装

#CIFS
###3.0 Windows 2008 DFS共有をマウントするためのサポート
##3.7 SMBv2サポート
Windows VistaからのSMBv2のサポート。
ただしv1との互換性がない。
###3.8 SMB2.02との互換性。vista/2008用。vers=2.0のマウントオプションが必要？
###4.2 SMB3.1.1(3.11)のサポート
###4.5 cache=looseオプションでO_DIRECTを使用可能
##4.12 Greatly improve asynchronous I/O
非同期I/Oの大幅な改善
##4.13 CIFS defaults to SMB3.0
Windows8/2012以降で使われているSMB3.0を標準に
旧バージョンはCIFSのマウントで "vers = 1.0"を指定
#GFS2
###3.2 大容量ファイルの削除/リンク解除のパフォーマンスを向上させる
###3.6 フラグメンテーションの防止
###3.8 Postmarkベンチマークを高速化
###4.5 拡張属性readaheadの最適化
###4.5 GFS2のNFSクッキーの管理方法を再構築
nfs-over-gfs2によるreaddirの問題を修正
#Ceph
###4.5 非同期IOサポート
###4.7 マルチファイルシステムのサポート
###4.7 OSDクライアントのアップデート
#NVDIMM
###4.1 不揮発メモリをRAMではなくブロックデバイスPMEMとして扱うように実装
###4.3 マッピングのサポート
#MD
##3.1 不良セクタの管理
不良セクタがリスト化され使わないようにする
新しいmdadmバージョンが必須？？？
なかったんかい！
###3.5 reshapeを元に戻せるように
###3.5 RAID10のreshapeサポート
###3.6 SSDにてI/Oサイズが大きい場合にアイドルディスクであればI/Oを分割する
タイトルはRAID1になっているが他のケースも可能
###3.7 TRIMのRAID0/1/5/10サポート
###3.10 デバイスを読み取り専用アレイに再追加できる
###3.11 5台のRAID6を4台に再形成できるように
##3.12 **RAID5のマルチスレッド化**
SSDでの書き込みで効果を発揮
##4.1 **RAID5/6において書き込み時にまとめて書き込みできるようにし30％の性能向上**
###4.1 RAID5/6において構成オプションrmw_levelを導入
/sys/block/mdX/md/rmw_levelでrmwロジックが変更可能に

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=d06f191f8ecaef4d524e765fdb455f96392fbd42
###4.1 RAID5においてストライプキャッシュの拡張/縮小をサポート
###4.5 raid5-cache:ジャーリングされたRAID5のホットアド、ホットリムーブサポート
###4.9 RAID6のAVX-512最適化
###4.11 Journaled RAID5 to close the write hole
4.4でレイヤーが追加されていたMD層のジャーナルデバイス（通常はNVRAMまたはSSD）にてRAID4/5/6にジャーナリングサポートを追加
AtomicityのためまずREDOログに書いてからディスクに書き込まれるようになり、クラッシュでデータ破損に強くなる。
###4.12 Add support for Intel IMSM's Partial Parity Log
インテル® マトリックス RAIDにてRAID5 書き込みホールを阻止する
修正されたチャンクと部分パリティを排他的論理和することにより、パリティを作成する。
mdadmにてオプション--consistency-policy=pplが必要
書き込みパフォーマンスは最大30-40%低下
###4.12 Improve RAID5 IO pattern to improve performance for hard disk based RAID5/6
RAID5のIOパターンを改善し、ハードディスクベースのRAID5 / 6のパフォーマンスを向上
###4.12 md-cluster: add the support for resize
クラスタにRAID1ミラーリングを提供するmd-clusterのリサイズをサポート

#Device mapper
###4.0 dm-crypt scalability improvements
dm-cryptで空きCPUを効率的に使用できるようにしパフォーマンスの大幅向上
##4.1 devicemapperにおいてMQの実装
NVMe下において最大20％高速になる
dm_mod.use_blk_mq module/boot optionを有効にすること
cat /sys/block/dm-X/dm/use_blk_mqで確認
###4.7 devicemappermultipath: blk-mqを使用するときの大規模なNUMAシステムパフォーマンスを大幅に向上
###4.8 devicemapperでDAXのサポート
###4.8 devicemappermultipathでのbio-basedサポートの再開
queue_mode <mode>でbio、rq、mqを選択できる
###4.10 Improved support for O_DIRECT on block devices
AIOを使わずO_DIRECTを使う場合の最適化
###4.12 add raid4/5/6 journal write-back support via journal_mode option
ライトバックでジャーナルをRAID4/5/6でサポートする
###4.15 add DAX support to the DM log-writes target
DMログ書き込み対象にDAXを追加
#OverlayFS
##3.18 OverlayFSのサポート
Overlayfs を使用すると、読み書きできる通常のディレクトリツリーを、他の読み取り専用のディレクトリツリーの上に重ねることができます。変更は全て、上部の書き込み可能なレイヤーに行われます。このような仕組みは主としてライブ CD で使われていますが、他にも（コンテナなど)幅広い用途が考えられます。
##4.0 複数のレイヤーを指定することが可能に
###4.2 分散ファイルシステムをlower layerとしてサポート