cpuコア数に応じたrps_cpusに入れる値の計算方法

こんにちは。OPSのほうの小宮です。
cpuコア数に応じたrps_cpusに入れる値の計算方法です。

ネットワークの割り込み処理を複数コアに分散したいという要望がありまして。(特にキャッシュサーバ)

できる人に頼って、ここ↓まで頑張ってもらいました。

[shell]# core=1
# echo "obase=16; ibase=10; $(( 2 ** ${core})) -1" | bc | tr ‘[A-Z]’ ‘[a-z]’
1
# core=2
# echo "obase=16; ibase=10; $(( 2 ** ${core})) -1" | bc | tr ‘[A-Z]’ ‘[a-z]’
3
# core=4
# echo "obase=16; ibase=10; $(( 2 ** ${core})) -1" | bc | tr ‘[A-Z]’ ‘[a-z]’
f
# core=5
# echo "obase=16; ibase=10; $(( 2 ** ${core})) -1" | bc | tr ‘[A-Z]’ ‘[a-z]’
1f[/shell]

それをもとに作ったchefのレシピ(bashですみません)
[shell]$ vim site-cookbooks/base_setting/recipes/rps_cpus.rb
————–
package "bc" do
not_if "which bc"
action :install
end

package "irqbalance" do
not_if "rpm -qa|grep irqbalance"
action :install
end

service "irqbalance" do
supports :status => true, :restart => true, :reload => :true
action [ :enable, :start ]
end

rps_path="/sys/class/net/eth0/queues/rx-0/rps_cpus"
rps_flow_path="/sys/class/net/eth0/queues/rx-0/rps_flow_cnt"
rps_sock_path="/proc/sys/net/core/rps_sock_flow_entries"

bash "set-rps_flow" do
only_if "ls #{rps_flow_path}"
code <<-EOC
echo 4096 > #{rps_flow_path}
cpucore=cat /proc/cpuinfo|grep -c processor
sock_num=echo "4096 * ${cpucore}"|bc -l
echo ${sock_num} > #{rps_sock_path}
cpubitmap=echo "obase=16; ibase=10; $(( 2 ** ${cpucore})) -1" | bc | tr '[A-Z]' '[a-z]'
echo ${cpubitmap} > #{rps_path}
EOC
end
————–[/shell]

<参考>
CentOS 6.2 で RPS/RFS を使ってネットワークの割り込み処理を複数コアに分散してみた

RSS対応NICなのに割り込み処理が複数コアに分散しない…のはirqbalanceが動いてなかったから

RH的なドキュメント

rps_cpus の値の指定方法について情報

——————————
例1:
(前略)eth0上のrx-0キューに対してCPU 0、1、2、3を使用するには、rps_cpusの値を次のようにf (16進数で1+2+4+8 = 15)に設定します。

例2:
(前略)eth0上のtx-0キューに対してCPU 4、5、6、7を使用するには、rps_cpusの値を次のようにf0 (16進数で16+32+64+128 = 240)に設定します。
——————————

VIOPS06で「RPS・RFS等最新Linux Kernel事例」と題してお話してきました – かーねる・う゛いえむにっき
1. 例えば、RSS非対応NICでアプリケーションに対して効率的なマルチコア対応を図る為にRPS&RFSが実装されたが、仮想化環境に対してはどうか。
KVMのvirtio-net、vhost-netのマルチキュー対応というパッチは出ていた。マージされたかは未確認(LinuxCon 2011の段階では未マージだった)。

とか書いてあって物理じゃなくて仮想な場合に/proc/intteruptsとか確認してもよくわからない感じではありました。
http://tsuchinoko.dmmlabs.com/?p=519″ target=”_blank”>マルチキュー ネットワークインターフェース(修正) | ツチノコブログ

とりあえずこんなところです。読んでいただいてありがとうございました。

20140404追記:どうやらOS再起動すると設定が消えます。rc.localとかに書いておいたほうがいいようです。
[shell]vi /etc/rc.local
—————–
echo ‘ffff’ > /sys/class/net/eth0/queues/rx-0/rps_cpus
echo 32768 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt
echo 32768 > /proc/sys/net/core/rps_sock_flow_entries
—————–[/shell]

おすすめ記事