Posts Tagged ‘CentOS’

    はてなブックマーク - RAID5がiowait出まくりで遅いので、stripe_cache_sizeを増やした話
    このエントリーをはてなブックマークに追加

    あけましておめでとうございます。
    Fusic 平田です。
    新年気分とは何の関係もない、RAIDのお話です。

    年末にXenサーバのディスクがお亡くなりになったので、ディスク換装してCentOS6.2でKVMサーバを再構築。
    で、ディスク4本なのでどうしようかなーと思いつつRAID5を組んではみたのですが、iowaitが収まらない。
    特に書き込みのほうが苦戦しているようで、仮想サーバがちょっと頑張るたびにロードアベレージが10越えたり。
    これじゃ使い物にならんなあ最悪RAID10で組み直したほうがいいかなあ。。。とか悩んでいる時に以下の記事を発見。
    peterkieser.com/2009/11/29/raid-mdraid-stripe_cache_size-vs-write-transfer/
    ※ 記事中のスクリプトまでは試していません。
    書き込みで苦しんでいるならstripe_cache_size増やすと捗るよ!ってことでやってみました。

    サーバスペック:
    Xeon X3230 (4コア) メモリ8GB HDD1TB*4(RAID5, software raid)

    対象のRAIDアレイ(今回はmd3)に対して

    # echo 8192 > /sys/block/md3/md/stripe_cache_size

    と実行して値を書き換えます。
    resyncがかかってしばらくしたら完了したので、あとはtopでだらだら流して様子見。
    仮想サーバ側で何度か負荷の高い処理をしてみてもロードアベレージがさほど上がらなくなったので、とりあえずはよし。

    あとはOS再起動しても動くように、ruleを追加。

    # cat <<EOS > /etc/udev/rules.d/80-md-stripe-cache.rules
    SUBSYSTEM=="block", KERNEL=="md*", ACTION=="change", TEST=="md/stripe_cache_size", ATTR{md/stripe_cache_size}="8192"
    EOS

    今のところ、これで快適に動作しています。
    問題が起きないか、最大限の関心を持って注視を続けることが当面の隠れ業務です。

    ・・・ていうか、そもそもRAID5使わないとかsoftware raid使わないとか別の方策あった気もします。

    追記:
    8192でも微妙につっかえる場面が見受けられたので、結局32768(最大)まで増やしています。
    ページサイズ(=4KB)×stripe_cache_size×ディスク数分のメモリ使うので、あんまし増やしすぎるのも嫌だなーと思ったんですが。
    メモリで困る前にCPU数で困りそうな気がしたのと、メモリは最悪増設できるしなーってことで、とりあえずはこのままで。

      はてなブックマーク - サービスは止まっていないのにネットワークエラーが・・・なぜ?
      このエントリーをはてなブックマークに追加

      奥さまの名前は CentOS、旦那さまの名前はしんちゃん。
      ごく普通のサーバに、ごく普通にインストールし、ごく普通の納品をしました。
      でも、ただひとつ違っていたのは、ifconfig を叩くと………エラーが発生していたのです!

      *・゜゚・*:.。..。.:*・゜゚・*:.。. (n‘∀‘)η

      はじめての人もそうでない人もはじめまして。 河野と申します。

      Advent Calendar はスタートの火蓋が切られたばかりにも関わらず、私だけが二週目に突入しました。
      マッハ号もかくやといったところです。

      さて、本日は「サービスは止まっていないのにネットワークエラーが増え続ける」という奇妙な問題を解決した際のお話を皆様にしたいと思います。

      尚、サーバはCentOS となります。

      エラーの増加

      サンプルに偏りがあるのを承知で言いますが「サービスは止まっていないのにネットワークエラーが増え続ける」。
      そういった事象はあまり無いのではないかと思われます。
      ネットワークにエラーがある場合は、サービスどころかネットワーク自体が疎通出来なくなる事が多いのではないでしょうか?

      ところが今回のエラーは以下のような特徴を持っていました。

      • リモートからサーバへのアクセスが可能
      • ローカルから外部へのアクセスが可能
      • パケットのエラーが増え続ける

      エラー発生当初、サービスに支障が出ていないので、今後の経過を見るという判断になりました。

      このサーバには Munin というサーバ動作ログを視覚的に閲覧することの出来るソフトウェアをインストールしていたのですが、見るたびにサーバのエラーは増えていきました。

      # ifconfig
      eth0      Link encap:Ethernet  HWaddr 00:03:0D:34:8F:AD
                inet addr:10.1.0.1  Bcast:10.255.255.255  Mask:255.0.0.0
                inet6 addr: fe80::203:dff:fe34:8fad/64 Scope:Link
                UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                RX packets:5505120 errors:869 dropped:0 overruns:0 frame:869
                TX packets:563000 errors:0 dropped:0 overruns:0 carrier:0
                collisions:30 txqueuelen:1000
                RX bytes:900322789 (858.6 MiB)  TX bytes:102707436 (97.9 MiB)
                Interrupt:209 Base address:0xd800

      ※ ↑は執筆時に仮想サーバにてエラーを発生させてみたものです

      問題の調査

      色々と調査した結果、Auto-Negotiation 機能に問題があるのではないかという結論に至りました。

      ethtool コマンドで eth0 を調査した結果 half-duplex(半二重)になっていたからです。

      # ethtool eth0
      Settings for eth0:
              Supported ports: [ TP MII ]
              Supported link modes:   10baseT/Half 10baseT/Full
                                      100baseT/Half 100baseT/Full
              Supports auto-negotiation: Yes
              Advertised link modes:  10baseT/Half 10baseT/Full
                                      100baseT/Half 100baseT/Full
              Advertised auto-negotiation: No
              Speed: 100Mb/s
              Duplex: Half
              Port: MII
              PHYAD: 1
              Transceiver: internal
              Auto-negotiation: off
              Supports Wake-on: pg
              Wake-on: d
              Current message level: 0x000000c5 (197)
              Link detected: yes

      このサーバの eth1 はバックアップ装置と直繋ぎしておりこちらの通信モードは full-duplex(全二重)に設定されています。

      この結果から eth0 と繋がれているスイッチが full-duplex 固定に設定されており Auto-Negotiation 設定時に通信モードを返さなかった為、デフォルトの半2重設定を行ったと考えられました。

      問題の解決

      そうと分かればサーバ側の eth0 の設定を full-duplex 固定にしてしまえばいいだけの話です。

      ローカル環境で確認後、本番で行なった変更は ifcfg-eth0 の最後に以下の一文を加えるだけ。

      # vim /etc/sysconfig/network-scripts/ifcfg-eth0
      ETHTOOL_OPTS="autoneg off speed 100 duplex full"

      但し、ネットワークリスタートする必要があります。

      ちなみに eth-tool コマンドでも設定可能です。

      ● eth0 の autonegotiation を off

      # ethtool -s eth0 autoneg off

      ● eth0 の duplex を full にする

      # ethtool -s eth0 duplex full

      こちらは再起動を行なうと設定が消えますので、再起動後も設定を反映する場合は上記のようにデバイスの設定ファイルに設定を記述してください。

      最後に

      今回一番困ったのは「利用者からは問題がないように見える」点です。
      無視するわけにもいかないが、無視できる範囲のエラーなので、システムを停止することが難しいサーバや、社内システムだと止めるほどでも無いかもしれません。

      今回のエラーはサーバを設置してすぐだったため、トラフィックが増えてエラーが無視できなくなってくる前に対応する事にしました。

      どういったエラーでも対応すべきか、無視できるかは熟慮・検討する必要があるかと思いますが、今回のエラーは判断に迷う内容でした。

      結論からするとエラーは対応すべきものと私は思います。 が、技術的視点以外からの判断が加わってくると対応しないという結論もあるかもしれませんね。

        はてなブックマーク - USBメモリでブートして、CentOS5.5をネットワークインストール
        このエントリーをはてなブックマークに追加

        連発してどうもスミマセン、山本です。

        先日、CentOS5.5をネットワークインストールする際につまづいたので、その際のメモと注意を書かせてもらいます。

        CentOSをインストールするにあたっては、まずはブートしなければいけません。
        その方法としては、
        ・CDからブート
        ・USBメモリブート
        ・ネットワークブート(PXEBoot)

        敷居の高さは、上から順に高くなるかと思います。
        CDからブートは、単にブート用のisoイメージを取得し、CDに焼き、ブート時に選択するだけで簡単ですが、
        USBメモリからブートも、ネットワークからのブートも、ちょっとした設定がいるのでやや面倒です。
        しかし、USBメモリからブートに関しては、楽にできるツールもあるためやや敷居が下がる感じです。
        今回はUSBメモリからブートをすることにします。
        (どうせなら、全てネットワークにすればいいのでは?というツッコミはなしで。。。
        USBメモリならではの問題がありますので)

        USBメモリをブート用のデバイスにするためには、まずはネットワークインストール用のisoイメージを取得します。
        CentOS5.5の64bitであれば、
        CentOS-5.5-x86_64-netinstall.iso
        という名前で配布されてます。

        このisoイメージを基に、USBメモリからブートできるようにするには色々と設定が必要ですが、
        UNetbootinというソフトを使えば、簡単に作成できます。
        UNetbootin – Homepage and Downloads
        ソフトを起動し、USBメモリを挿し、isoイメージを選択してOKを押すだけで必要なファイルが作成されます。

        そして、このUSBメモリをサーバーに挿し、ブートを行ないます。
        ネットワークインストールを行うためには、”Installation Method”という画面で、”FTP” (もしくは”HTTP”)を選択します。
        そして、FTPのサイトの設定です。

        FTP site name : “任意のFTPサイト”
        CentOS directory : xxxxx/linux/centos/5.5/os/x86_64
        ※Directoryはサーバーによって異なりますが、バージョンの次のディレクトリは isos ではなくて、 os であることに注意

        後は、通常のインストールと同様に進めます。
        しかし、無事インストールも終わって、いざ起動と思ったらGRUBが見つからないとのことで起動しませんでした。
        なぜだろうと思い、試しにUSBメモリをもう一回挿して、そこから起動させると無事、ログイン画面が表示されました。
        どうやら、GRUBがUSBメモリへ書き込まれたようです。

        これを回避するためには、GRUBに関するファイルを本体へコピーすればいいでしょうが、インストール時において設定を変えることで回避できます。
        インストール時に「高度なブートローダーオプションの設定」にチェックを入れて設定をすればいいのですが、
        CentOS5.5からでしょうか、その項目が見当たりませんでした。
        試行錯誤の末、以下の順序でその項目に辿りつきました。


        まず、パーティションの設定画面で、「パーティションレイアウトの再確認と変更」にチェックを入れて次に行きます。


        次に表れる画面では、そのまま次に行きます。


        次の画面でようやく、「高度なブートローダーオプションの設定」が表れました。
        これにチェックを入れて次に行きます。


        ここで、ドライブの順序を編集します。
        初期ではUSBメモリが上にきているので、本体のディスクを最上部へ移動させます。

        これで、無事に本体から起動することができるようになります。