インフォメーション, 雑談

はじめまして。昨日からツチノコの仲間になりました。

DMMのエンジニアはなかなか表に出てこないと言われておりましたが最近は表に積極的に出てくるようになりました。現在発売中の、技術評論社「WEB+DB PRESS」Vol.78(12/21発売)で、DMM.comの特集「開発ノウハウ大公開」が掲載されています。

DMM.comラボリリース情報↓
http://labo.dmm.com/information/2013/1216/

DMM.comでは実は本も売っています。

DMM.com 本・コミック通販: WEB+DB PRESS Vol.78
http://www.dmm.com/mono/book/-/detail/=/cid=bkt33028429/

 

新人ツチノコも露出を増やすべく、来週の1/22〜24にかけて別府までJANOG33というイベントに参加しに行きます。

JANOG33 Meeting
http://www.janog.gr.jp/meeting/janog33/

インターネットの旬のネタについて、あれこれディスカッションする、という楽しいイベントです。
スタッフの中に新人ツチノコがいるはずなので、気軽に声をおかけくださいませ。ツチノコっぽい話も多少はできるかもしれません。

ウェブからの参加登録は締め切っていますが、当日会場にふらりと来ていただければ参加可能のはずです。懇親会等への参加については事務局にメールをしてみてくださいませ

linux, 小ネタ, 運用管理

デバイスがどのCPUに割り込みのリクエストを出すのかを調整するためにはaffinity設定を利用し実現します。

affinityの設定は/proc/irq配下のそれぞれのirq番号配下のsmp_affinityの値を16進数で修正しなくてはいけません。
マルチキューを持つネットワークインターフェースであればそれぞれ割り当てられているIRQ番号で設定を行っていく必要があります。
たとえばecho ffffff > /proc/irq/70/smp_affinityといった感じで設定します。
参考:マルチキューネットワークインターフェース

これを簡単に行ってくれるtunaというツールがredhatより提供されているのをつい先日知りましたので共有します。
guiからでもcliからでも利用が可能なツールです。

兎にも角にも使ってみます。

まずはインストール※centos6のupdatesレポジトリに含まれていました。

CPUが24スレッドの環境において下記のような16進数の設定になっています。
aaaaaaは1,3,5,7,9,11,13,15,17,19,21,23のCPUを利用し、
555555は0,2,4,6,8,10,12,14,16,18,20,22のCPUを利用されることになります。

この値を変更する場合は

これでp1p1のネットワークインターフェースですべてのCPUを利用することになります。

コマンドで確認してみます。

ffffffとなり設定が変更されたことがわかると思います。

注意点としてはirqbalanceで上書きされないように留意しなくてはいけないところですかね。

tuna –show_threadsとすると、たとえばnginxがどのCPUに割り込み要求を出すのかも分かりますので、
意図的にnginxの割り込み先のCPUを制御したいときなんかにも使えると思います。

うち例だとこんな感じでthreadsが表示されます。

linux, インフラ全般, クラウド

現状の仮想環境ではマルチキューが利用できません。したがってmemcachedなどのミドルウェアを仮想上で動作させると必ず一つのCPUに偏ります。これを回避するためにはrhelの7系のカーネルを待つしかありません。

と思っていたところ、

RPS/RFSの設定でCentOS6.xで仮想環境でCPUの偏りをなくすことができるようです。
RPS/RFSを使用するとソフトウェア的にNICの割り込みに使用するCPUを分散してくれます。
dmmで利用しているmemcachedのサーバで設定してみたところ、
実際にCPUコアの偏りが無くなったことが確認できました。

入れ替え前のmemcachedサーバのCPU負荷
cpuの1に偏っています。

RPS/RFS設定を行ったmemcachedサーバのCPU負荷
cpuの0,1,2,3と綺麗に分散されています。

設定例

/sys/class/net/eth0/queues/rx-0/rps_cpus は使用するCPUを指定します。
各コアを使用するかのフラグと2進数で各ビットを立て、16進数に変換します。
1,2コアを使用する場合は
2進数で 11 → 16進数に変換して3を設定。
1,2,3,4コアを使用する場合は
2進数で 1111 → 16進数に変換してfを設定。

これにより、ネットワーク系のエラーやmemcachedのレスポンスタイムが改善しています。

・入れ替え前
before_rps

・入れ替え後
after_rps

linux

私の中でちょっと問題になった部分を共有します。

kernel: nf_conntrack: table full, dropping packet
このエラーでよく紹介されている解決方法が
sysctl.confに設定を追記してsysctl -pで設定を読み込ませるという方法です。

確かにこれでも問題はありません。わたしもこの方法でやってます。
ただし、iptablesを使っている方には問題がでる可能性があります。

conntrackテーブルはiptablesで利用されているnetfilterモジュールに設定される値ですので、iptablesを再起動など行ってしまうと一度そのモジュールが読み込みなおされることになり、設定が初期化されてしまいます。この事実を知らずにiptablesを再起動しちゃうと、混雑する深夜の時間帯にkernel: nf_conntrack: table full, dropping packetとなり、たたき起こされてしまうことになりかねません。私がそうです。^^;

これを回避するためは
sysctl.confではなくmodprobe.dディレクトリ配下に設定ファイルを置きます。

vi /etc/modprobe.d/conntrack.conf
options nf_conntrack hashsize=25000

例えば上記のように設定しておけばnetfilterモジュールの読み込み時(iptablesの再起動時)にこの設定が読み込まれ、値に合わせたテーブルサイズに変更してくれます。

ちなみにnf_conntrack_maxの値を200000にする場合は
hashsizeで8分の1の値(25000)を設定しておけば20万となります。

hashsizeで設定を行う場合は下記のパラメーターに変更が加えられます。
※下記は6系の例

あと、rhelの5系と6系でも違いがあります。
6系になるとiptablesの起動スクリプトでsysctlも親切に読み込んでくれるようになっています。なのでsysctl.confで設定しておいても値が初期化されることはなくなります。
※5系のiptablesの起動スクリプトではsysctlを読み込んでくれません。

ただし、modprobe.d配下の設定ファイルとsysctl.confのファイルが混在している場合は
modprobe.d配下の設定ファイルが優先されていますので注意が必要です。

sysctl.confで設定を増加させた後、6系なのでと安心しきっていると、
誰かがiptablesを再起動してmodprobe.dの設定が読み込まれて再度問題となるなんてこともあるかもしれませんよ。

PAGE TOP