はじめに (対象読者・この記事でわかること)

この記事は、Linuxサーバーの運用管理に携わるシステム管理者や、CentOS7のパフォーマンスチューニングに興味がある方を対象としています。特に、メモリ使用率が高くなった際にシステムがどのように振る舞うのか、その仕組みを深く理解したい方に最適です。

本記事を読むことで、CentOS7におけるスワップの仕組み、スワップイン・スワップアウトがシステム領域でI/Oを引き起こす理由、そしてその影響を最小限に抑えるための具体的な対策方法を理解できます。これにより、サーバーのパフォーマンス問題の根本原因を特定し、適切な対応策を講じることができるようになります。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。

  • Linuxの基本的なコマンド操作
  • ファイルシステムの基本概念
  • メモリ管理の基礎知識
  • CentOS7の基本的なシステム構造

スワップの概要と必要性

スワップとは、物理メモリ(RAM)が不足した際に、一時的に使用されていないメモリ領域をディスク上の領域(スワップ領域)に退避させるLinuxのメモリ管理機能です。これにより、物理メモリが不足してもシステムが停止することなく動作を継続できます。

CentOS7では、スワップ領域としてスワップファイルまたはスワップパーティションを使用します。スワップ領域のサイズは一般的に物理メモリの1〜2倍に設定されることが多く、システムの安定性に重要な役割を果たします。

スワップはシステムの安定性確保には不可欠ですが、ディスクI/Oが発生するため、過度なスワップはシステム全体のパフォーマンスを低下させる要因となります。特に、システム領域(/パーティション)にスワップ領域が設定されている場合、I/O競合が発生し、システム全体の応答性が著しく低下することがあります。

スワップがシステム領域でI/Oを引き起こす仕組みと対策

スワップファイルとスワップパーティションの違い

CentOS7では、スワップ領域として主に2つの形式が利用できます。

  1. スワップパーティション:ディスクをパーティション分割時に専用に確保される領域
  2. スワップファイル:既存のファイルシステム内に作成されるファイル

スワップパーティションはパフォーマンス面で若干有利ですが、サイズ変更が面倒です。一方、スワップファイルは柔軟にサイズ変更できますが、ファイルシステムのオーバーヘッドが発生するため、パフォーマンスがわずかに低下する可能性があります。

特に、スワップファイルがシステム領域(/パーティション)に配置されている場合、システムのI/OとスワップのI/Oが同じディスク上で競合し、パフォーマンスが著しく低下することがあります。

スワップイン・スワップアウトのプロセス

スワップの動作には主に2つのプロセスがあります。

  1. スワップアウト(Swap Out): - 物理メモリが不足すると、カーネルはLRU(Least Recently Used)アルゴリズムに基づいて、使用されていないメモリページを特定 - これらのページをディスク上のスワップ領域に書き出す - 物理メモリを解放して新しいプロセスやデータのための領域を確保

  2. スワップイン(Swap In): - スワップアウトされたページが必要になった場合、ディスクから物理メモリに読み込む - プロセスがページにアクセスしようとした際にページフォールトが発生 - カーネルがスワップ領域から該当ページを読み込み、物理メモリにマップ

これらのプロセスでは、ディスクI/Oが必須であり、特にスワップアウトは大量の書き込みを伴います。

なぜシステム領域でI/Oが発生するのか

CentOS7でスワップイン・スワップアウトがシステム領域でI/Oを引き起こす主な理由は以下の通りです。

  1. スワップ領域の配置: - スワップファイルがシステム領域(/パーティション)に配置されている場合、システムのI/OとスワップのI/Oが同じディスク上で競合 - システム領域にはOSの実行に必要なファイルやアプリケーションデータが格納されており、常にI/Oが発生している状態

  2. ディスクのシーク時間: - スワップ操作では、ディスク上のランダムな位置にアクセスする必要がある - システム領域とスワップ領域が同じディスク上にある場合、ヘッドの移動(シーク)が頻繁に発生し、I/O性能が低下

  3. I/O帯域の競合: - システムプロセスとスワップ操作が同じディスクのI/O帯域を共有する - 特にスワップアウト時には大量の書き込みが発生するため、システム全体のI/O性能が著しく低下

I/O性能への影響と対策

スワップがシステム領域でI/Oを引き起こす場合、以下のような影響が考えられます。

  1. システム全体の応答性低下: - アプリケーションの応答時間が遅延 - ユーザー体験の悪化

  2. ディスクの摩耗加速: - 特にHDDの場合、ヘッドの移動が増加し、物理的な摩耗が進む - SSDの場合、書き込み回数の増加により寿命が短くなる可能性

  3. システムの不安定化: - I/O待ち時間の増加により、システム全体の処理能力が低下 - 極端な場合はシステムフリーズの原因に

これらの問題を解決するための対策を以下に示します。

対策1:スワップ領域の最適な配置

最も効果的な対策は、スワップ領域をシステム領域とは別のディスクパーティションに配置することです。

Bash
# 新しいパーティションにスワップを作成 sudo mkswap /dev/sdb1 sudo swapon /dev/sdb1 # /etc/fstabにエントリを追加 echo '/dev/sdb1 swap swap defaults 0 0' | sudo tee -a /etc/fstab

対策2:スワップファイルの使用を避け、スワップパーティションを使用する

スワップファイルはファイルシステムのオーバーヘッドがあるため、可能であればスワップパーティションを使用することを推奨します。

Bash
# 現在のスワップを無効化 sudo swapoff -a # スワップファイルを削除 sudo rm /swapfile # 新しいスワップパーティションを作成 sudo fdisk /dev/sdb # パーティション作成 sudo mkswap /dev/sdb1 sudo swapon /dev/sdb1

対策3:swappinessパラメータの調整

vm.swappinessパラメータは、カーネルがスワップを使用する頻度を制御します。デフォルト値は60ですが、これを下げることでスワップの使用を抑制できます。

Bash
# 現在の値を確認 cat /proc/sys/vm/swappiness # 値を変更(例: 10に設定) sudo sysctl vm.swappiness=10 # 設定を永続化 echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf

対策4:メモリの追加またはアプリケーションの最適化

根本的な解決策として、物理メモリの追加やメモリを大量に消費するアプリケーションの最適化が考えられます。

Bash
# メモリ使用状況の確認 free -h top

対策5:tmpfsの活用

一時ファイルなどが原因でスワップが頻繁に発生する場合は、tmpfsを活用することでディスクI/Oを減らせます。

Bash
# /etc/fstabにエントリを追加 tmpfs /tmp tmpfs defaults,size=1G 0 0

まとめ

本記事では、CentOS7でスワップイン・スワップアウトがシステム領域でI/Oを引き起こす理由とその対策について解説しました。

  • スワップ領域がシステム領域に配置されている場合、I/O競合が発生しパフォーマンスが低下する
  • スワップパーティションを使用し、可能であれば別のディスクに配置することが有効
  • swappinessパラメータの調整や物理メモリの追加など、根本的な対策も重要

この記事を通して、スワップがシステムパフォーマンスに与える影響を理解し、適切な対策を講じることで安定したシステム運用ができるようになることを願っています。今後は、さらに高度なパフォーマンスチューニングのテクニックについても記事にする予定です。

参考資料