問題
LinuxのSSDディスク内のスワップパーティションでbackgroundTRIM操作を有効にしたい。いくつかの記事によると、例えば これ 、カーネルはこの構成を検出し、自動的に破棄操作を実行しますが、私のテストでは、「破棄」マウントオプションを使用してこの動作を強制していますが、機能していないようです。
シナリオ
背景
バックグラウンドTRIMがスワップパーティションで機能しているかどうかを確認するために実行する手順は次のとおりです。
TRIMサポート:SSDディスクがTRIMコマンドをサポートし、カーネルがデバイスに非回転としてフラグを立てているかどうかを確認します。
_# hdparm -I /dev/sda | grep TRIM
* Data Set Management TRIM supported (limit 1 block)
* Deterministic read data after TRIM
# cat /sys/block/sda/queue/rotational
0
_
スワップフィルアップ:パーティションをマウントし、すべてのVMキャッシュをクリーンアップし、vm.swappinessを積極的にスワップするようにLinuxを構成します次に、使用可能なすべてのメモリを割り当て、カーネルにスワップを開始させるスクリプトを実行します。
_# swapon [--discard] /dev/sda2
# echo 3 > /proc/sys/vm/drop_caches
# echo 100 > /proc/sys/vm/swappiness
# ./fill-up-memory.up
_
スクリプトは、32 GBの物理メモリ+ 2 GBのスワップパーティションを備えたサーバー上で実行し、メモリ内に最大33.8 GBのオブジェクトを作成します。これは、すべてのメモリをいっぱいにしてスワップを開始するのに十分ですこれは、この動作を実現するスクリプトの例です。
_#!/usr/bin/python
mem = 33.8
testing = 'A' * int(1024 * 1024 * 1024 * mem)
raw_input()
_
スワップの内容を確認してください:「swapon-s」は、スワップメモリが100%使用されていることを示しています。 「hdparm --read-sector」を使用して、スワップパーティションセクターの生の内容を確認します。すべてのバイトが「4141」に設定されています。これは、スワップパーティションのコンテンツをセクターごとに読み取るためのスクリプトの例です。
_#!/bin/bash
for sector in `seq 194560 4100095` ; do
hdparm --read-sector $sector /dev/sda
done
_
注:parted、cfdiskなどを使用して、スワップパーティションの開始/終了セクターを取得できます。
スクリプトを停止すると、スワップ割り当てを含むすべてのメモリが解放されます。「swapon -s」を実行すると、システムでスワップの使用量が返されません。この時点で、Linuxはバックグラウンドでスワップパーティションのコンテンツの破棄を開始すると予想されますが、機能しません、セクターのコンテンツは数時間後でも「4141」のままです。
私はいくつかのテストを行いましたが、Linuxはswapon()
システムコールを使用してパーティションが有効になっている場合にのみ完全破棄を実行し、バックグラウンドでは実行しないようですが、/ etc/fstabで「破棄」マウントオプションが有効になっています。
さらなる調査:blkdev_issue_discard()は、基になるSSDデバイスへのTRIMコマンドの送信を担当するカーネル関数です。_mm/swapfile.c
_では、この関数への2つの固有の参照があります。
discard_swap()
swapon()プロセス中に呼び出されます。「破棄」マウントオプションが有効になっていると、すべてのコンテンツが破棄され、期待どおりに動作します。discard_swap_cluster()
クラスタースワップの内容を破棄する必要がありますが、TRIMコマンドを実行しないようです。質問:スワップ+ SSDデバイスでのLinuxの予想される動作は何ですか?すべての空きセクター/ページを破棄するか、最初の完全破棄を発行するのは次の場合のみです。パーティションは起動プロセス中に有効になりますか?ありがとう。
システムのデフォルトが--discard=once
である可能性があります。特定の廃棄オプションを使用してマウントしてみましたか?
# nano /etc/fstab
________________________________________________________________
...
/dev/sda2 none swap ..., --discard=pages,... ...
...
このように強制する:
# swapon --discard=pages /dev/sda2
fstrim
サービスを作成するか、すでに利用可能な場合は構成することもできます。
discard_swap_clusterはscan_swap_mapからのみ呼び出され、次にget_swap_pageまたはget_swap_page_of_typeから呼び出されるようです。したがって、私が正しければ、破棄は、ページが解放されたときではなく、新しいスワップページが割り当てられるときにのみ発生します。