目次

05 Linuxチューニング

ディスクIO

①.午前四時の高負荷(Cron)

mlocate, makewhatis のCronを停止する。

  chmod 0 /etc/cron.daily/mlocate.cron
  chmod 0 /etc/cron.daily/makewhatis.cron
  chmod 0 /etc/cron.weekly/makewhatis.cron

②.Swap

02 Swappiness

# echo 1 > /proc/sys/vm/swappiness

③.IOキューサイズ変更

ディスクIOのキューサイズは低いほどレスポンス重視、高いほどスループット重視

 # echo 1024 > /sys/block/ディスクデバイス名/queue/nr_requests
 # echo 128 > /sys/block/ディスクデバイス名/queue/nr_requests

④.IOスケジューラ

http://city.hokkai.or.jp/~hachikun/IOScheduler.html

 # echo deadline > /sys/block/ディスクデバイス名/queue/scheduler
 # echo noop > /sys/block/ディスクデバイス名/queue/scheduler

read_ahead_kb

 # echo 4096 > /sys/block/ディスクデバイス名/queue/read_ahead_kb

dm-*デバイス

dm-*デバイスは設定を反映せずにsd*から設定を継承します。

It is expected behavior that you only see the settings take effect for the sd* devices. 
The dm-* devices will not reflect the change directly but will inherit it from the sd* devices that make up its path. 

⑤.noatime

31 ディスクのマウントオプション変更(noatime)

⑥.Writebackの設定

http://portaltan.hatenablog.com/entry/2015/10/15/145823

vm.dirty_background_ratio

メモリ上のdirtyメモリが占める割合(%)。
この値を超えるとpdflushが呼び出され、write back処理がが行われる。
但し、このwrite back処理は優先度の低いバックグラウンドプロセスとして実行される。
デフォルト値は10%。単位は%

# sysctl vm.dirty_background_ratio
vm.dirty_background_ratio = 10

vm.dirty_ratio

vm.dirty_backgroup_ratioとほぼ同じだが、この値を超えた場合は、write back処理が優先度の高いフォアグラウンドプロセスとして実行される
デフォルト値は20%。単位は%

# sysctl vm.dirty_ratio
vm.dirty_ratio = 20

vm.dirty_expire_centisecs

メモリ上に存在しているdirtyメモリの存在時間。
この値を過ぎた場合にwrite back処理が実行される
デフォルト値は3000(30秒)単位は1/100秒

# sysctl vm.dirty_expire_centisecs
vm.dirty_expire_centisecs = 3000

vm.dirty_writeback_centisecs

pdflushデーモンが起動する間隔。
この間隔でdirtyメモリのデータが物理ディスクに書き込まれる
デフォルト値は500(5秒)。単位は1/100秒

# sysctl vm.dirty_writeback_centisecs
vm.dirty_writeback_centisecs = 500

ネットワーク

①.sysctl.confに下記を追加

#net.ipv4.tcp_syncookies
net.ipv4.tcp_syncookies = 1
# net.ipv4.tcp_window_scaling
net.ipv4.tcp_window_scaling = 1
# net.core.rmem_max
net.core.rmem_max = 16777216
# net.core.wmem_max
net.core.wmem_max = 16777216
# net.ipv4.tcp_rmem
net.ipv4.tcp_rmem = 4096 87380 16777216
# net.ipv4.tcp_wmem
net.ipv4.tcp_wmem = 4096 87380 16777216
# net.ipv4.tcp_no_metrics_save
net.ipv4.tcp_no_metrics_save = 1
# net.ipv4.tcp_moderate_rcvbuf
net.ipv4.tcp_moderate_rcvbuf = 1
# net.core.netdev_max_backlog
net.core.netdev_max_backlog = 5000
#net.core.somaxconn
net.core.somaxconn = 4096
vm.swappiness = 1

New

https://pleiades.ucsc.edu/hyades/Linux_Network_Tuning

# http://fasterdata.es.net/host-tuning/linux/
# allow testing with buffers up to 128MB
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
# increase Linux autotuning TCP buffer limit to 128MB
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
# increase the length of the processor input queue
net.core.netdev_max_backlog = 250000
# recommended default congestion control is cubic
net.ipv4.tcp_congestion_control=cubic
# recommended for hosts with jumbo frames enabled
net.ipv4.tcp_mtu_probing=1
vm.swappiness = 1

/sbin/ifconfig eth0 txqueuelen 10000
/sbin/ifconfig eth1 txqueuelen 10000

txqueuelenは、送信パケットのキューの長さです。OSによって違いがあるとは思いますが一般的にはMTU x txqueuelenの値がキューに保持可能なパケットのサイズ
どこかで作ったパケットを送信するために一度パケットを並ばせる場所

反映
# sysctl -p

②.NICのオフロード機能を無効

for file in `ls /etc/sysconfig/network-scripts/ifcfg-eth[0-9]`
do
  ETH=`echo $file| sed 's/.*\(eth[0-9]\)/\1/g'`
  ethtool -K $ETH rx off
  ethtool -K $ETH tx off
  ethtool -K $ETH tso off
  ethtool -K $ETH gro off
done

CentOS6

CentOS6 ではなら TSO on / GSO off が良さそう。
http://uzy-exe.hateblo.jp/entry/2014/05/10/144824

for file in `ls /etc/sysconfig/network-scripts/ifcfg-eth[0-9]`
do
  ETH=`echo $file| sed 's/.*\(eth[0-9]\)/\1/g'`
  ethtool -K $ETH tso on
  ethtool -K $ETH gro off
  ifconfig $ETH txqueuelen 10000
done

tuned

コマンド一個で簡単にチューニングできるツール

tuned