Browse Month: November 2012

LinuxでCPUの動的クロック変更を無効にする方法

最近のLinuxでは、自動的にCPUの動的クロック変更が有効になっています。トラフィックの激しいサービスを受けるサーバーの場合、無効にしたかったので、その方法を調べてみました。エコでなくてすいません・・・。

まず、Ubuntu 12.10 amd64 では、次のとおりです。

1. cpufrequtils パッケージをインストールします

$ sudo apt-get install cpufrequtils

2. 現在の状態を確認します

$ cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
ondemand
...

ondemand という表示が CPU コア数分表示されている場合、CPU の動的クロック変更が有効になっています。

ついでに現在のクロック数を確認します

$ cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq
1600000
...

1.6GHz で動作しているようですね。

3. governor を performance にして、CPU の動的クロック変更を無効にします

$ sudo vi /etc/init.d/cpufrqutils
GOVERNOR="performance" に変更します
$ sudo /etc/init.d/cpufrequtils restart

これだけで変更可能です!

4. 念のためちゃんと設定されているか確認します

$ cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
performance

現在の動作クロック数を確認します

$ cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq
2134000

2.13GHz で動作しているようです。
その他、動的クロック数の最小・最大を確認するには、次のコマンドで確認できます。

$ cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_min_freq
1600000
...
$ cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_max_freq
2134000
...

ちなみに CentOS5 だと、cpufreq-utils パッケージをインストールして、/etc/sysconfig/cpuspeed の GOVERNOR に performance を追加して、/etc/init.d/cpuspeed restart を実行するだけでできます。

自宅サーバなどあまり使っていないサーバなどは、CPU の動的クロック変更を有効にしてエコにして、激しいサーバは無効にするのがいいではないかと思います。
今晩のピーク時間帯の負荷で比較して、効果のほどを確認したいと思います。

参考記事
CPU frequency scaling in Linux with cpufreq

追記:
CPU 的には Intel Xeon L5630 @ 2.13GHz だとこの設定は可能でしたが、Intel Xeon L5520 では proc 以下の cpufreq がなかったので CPU 依存しますので注意してくださいね!
L5630/L5520 を比較してみると Max Turbo Frequency が空なので対応していないようですね!

rsync に独自パッチをあてたお話

すっかり定番の rsync、最近とある案件で xinet.d 経由 rsync を使うことにしました。なぜ、SSH 経由ではないかというと、次の理由によるものです。

  • SSH 接続するときに、大人の事情で公開鍵を登録することができない
  • SSH 接続するときのパスワードを sshpass などで記述するのは微妙

ということで、さっそく設定みました。
xinet.d の rsync 設定は、次のような感じです。デフォルトだと、IPv6 が有効になっているので指定しないようにしました。flags = のだけだとエラーが出てしまったので、IPv4 を追加しています。

# default: off
# description: The rsync server is a good addition to an ftp server, as it \
# allows crc checksumming etc.
service rsync
{
disable = no
flags = IPv4
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}

そして、rsyncd の設定は、次のような感じです。

## Rsync logging settings
syslog facility =

## Global Settings
dont compress = *.gz *.tgz *.zip *.pdf *.sit *.sitx *.lzh *.bz2 *.jpg *.gif *.png

[hoge]
uid = naoya
gid = naoya
path = /naoya/data
comment =
hosts allow = *
hosts deny = *
read only = no

特に IP アドレスによるアクセス制限、ユーザ認証、は設定しません。

この設定で rsync してみると、次のようなログが毎回出力されてしました。

Nov 1 15:20:59 s1 rsyncd[31879]: name lookup failed for 192.168.1.1: Name or service not known

なぜか、192.168.1.1 を逆引きしているエラーのようです。特に IP アドレスの制限はしていないので不要なエラーログだと思い、rsync ソースコードをおってみると、どうやらデーモンモードのとき、必ず clientname.c で lookup_name システムコールを呼んでいました。

そこで、独自パッチを次のようにあてました。

--- ./clientname.c-org 2012-11-01 18:29:11.056361652 +0900
+++ ./clientname.c 2012-11-01 21:13:55.027757916 +0900
@@ -144,6 +144,10 @@
client_sockaddr(fd, &ss, &ss_len);
}

+ if (strncmp(lp_hosts_allow(fd), "*", 1) == 0
+ && strncmp(lp_hosts_deny(fd), "*", 1) == 0)
+ return name_buf;
+
if (lookup_name(fd, &ss, ss_len, name_buf, sizeof name_buf,
port_buf, sizeof port_buf) == 0)
check_name(fd, &ss, name_buf, sizeof name_buf);

環境は、CentOS 6.3 x86_64 rsync-3.0.6 でパッチをあてました。ついでに 3.0.9 にしようかと思いましたが、かなり独自のパッチがあっていて断念しました・・・。

実装的にはかなり微妙ですが、hosts allow と hosts deny の設定がどちらもとも「*」のときは lookup_name を呼ばすに許可するようにしました。

これで、不要なエラーログが出力されなくなり、幸せになりました。

rsync は、通常 SSH 経由で使うことがほとんだと思いますが、デーモンとして使っても SSH のオーバーヘッドがなくなるはずですし、そういう選択肢もいいかと思います☆