web-dev-qa-db-ja.com

Linux + SSDのスワップパーティションでのバックグラウンド破棄

問題

LinuxのSSDディスク内のスワップパーティションでbackgroundTRIM操作を有効にしたい。いくつかの記事によると、例えば これ 、カーネルはこの構成を検出し、自動的に破棄操作を実行しますが、私のテストでは、「破棄」マウントオプションを使用してこの動作を強制していますが、機能していないようです。

シナリオ

  • Linux 3.2.0を実行するDebian Wheezy
  • SSDディスク:1 x 120GB OCZ Vertex 3 MI
  • 他のレイヤー(LVM、RAIDなど)なしの2GBスワップ「プレーン」パーティション

背景

バックグラウンドTRIMがスワップパーティションで機能しているかどうかを確認するために実行する手順は次のとおりです。

  1. 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
    _
  2. スワップフィルアップ:パーティションをマウントし、すべての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()
    _
  3. スワップの内容を確認してください:「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の予想される動作は何ですか?すべての空きセクター/ページを破棄するか、最初の完全破棄を発行するのは次の場合のみです。パーティションは起動プロセス中に有効になりますか?ありがとう。

11
santisaez

システムのデフォルトが--discard=onceである可能性があります。特定の廃棄オプションを使用してマウントしてみましたか?

# nano /etc/fstab
________________________________________________________________
...
/dev/sda2    none    swap    ..., --discard=pages,...    ...
...

このように強制する:

# swapon --discard=pages /dev/sda2

fstrimサービスを作成するか、すでに利用可能な場合は構成することもできます。

1
kgizdov

discard_swap_clusterscan_swap_mapからのみ呼び出され、次にget_swap_pageまたはget_swap_page_of_typeから呼び出されるようです。したがって、私が正しければ、破棄は、ページが解放されたときではなく、新しいスワップページが割り当てられるときにのみ発生します。

1
lav