昨日インストールしたRedmineですが、格安VPSで動かすにはちとメモリを使いすぎる。
Ruby Enterprise Editionでpassengerを動かして、45%ものメモリを節約することに成功した。
その一部始終を語ろう。

昨日インストールしたRedmineですが、格安VPSで動かすにはちとメモリを使いすぎる。
Ruby Enterprise Editionでpassengerを動かして、45%ものメモリを節約することに成功した。
その一部始終を語ろう。
GitHubの大普及で、もうプログラマーさんはみんなgitで開発しているかと思います。
でも、大人数でリポジトリを扱ったり、いくつものプロジェクトを扱うと、アクセス管理が大変です。
アクセス管理を柔軟におこない、リポジトリの追加も簡単なgitosisを使いましょう。
Googleが公開しているApacheモジュールであるmod_pagespeedをさくらインターネットのVPSに導入して、このWordPressでつくられているこのBlogを高速化してみます。
公式サイト:http://code.google.com/p/modpagespeed/
配信されているコンテンツを高速通信、高速レンダリングできる形に変換してブラウザにコンテンツを返すApacheモジュールです。
つまり、あなた自身がサイトのコンテンツを最適化することなく、mod_pagespeedが全部自動でやってくれる、お手軽チューニングです。
これを見れば、どれだけ早くなるのかは想像がつくでしょう。
一例として以下のようなことをしてくれます。
などなど、機能は満載です。詳しくは公式サイトをご覧ください。
| 導入前 | 導入後 |
![]() |
![]() |
スコアが上がっています。
Ubuntu 10.4 64bit環境での手順です。
自分の環境に合わせたファイルをこちらからダウンロードしてください。
http://code.google.com/speed/page-speed/download.html
$ wget https://dl-ssl.google.com/dl/linux/direct/mod-pagespeed-beta_current_amd64.deb $ sudo dpkg -i ./mod-pagespeed-beta_current_amd64.deb $ sudo /etc/init.d/apache2 restart
基本的には以上で終了です。
細かいレベルでの設定をしたい人や導入したことにより問題が発生して人は設定を変えましょう。
設定ファイル
/etc/apache2/mods-enabled/pagespeed.conf
特に設定をしなくてもCoreFiltersが設定されています。(*1)
Filterのドキュメントを見る限り、以下がCoreFilterに含まれているようです。
add_head combine_css extend_cache inline_css inline_javascript insert_img_dimensions rewrite_images
詳しいドキュメントはこちら
いろいろと試行錯誤した結果CoreFiltersがドキュメントに記載されている内容と違うのではないか。という結果が出たりしたので、明示的にFilterを全部設定することにした。
Filterの詳しいドキュメントはこちら
実際の例などを記載したコンテンツはこちらが参考になる。
# ModPagespeedRewriteLevel CoreFilters
# Add
ModPagespeedEnableFilters combine_heads,combine_css
ModPagespeedEnableFilters move_css_to_head
ModPagespeedEnableFilters remove_comments
ModPagespeedEnableFilters collapse_whitespace,elide_attributes
ModPagespeedEnableFilters rewrite_javascript,rewrite_css,rewrite_images
# ModPagespeedEnableFilters inline_css,inline_javascript
ModPagespeedEnableFilters extend_cache
ModPagespeedDisallow */wp-admin/*
幸い、JavaScriptの動作などに不具合が出なかった。
だが、WordPressの管理画面側のJavaScriptがダメっだので、最後の行で無効にしている。
inline_cssやinline_javascriptはpagespeedの評価の結果が悪くなったのでコメントアウトした。
環境によって、Filterは細かく有効と無効を設定した方が良いでしょう。
逆に遅くなるケースというのはあるはずです。
JavaScriptの動作に不具合が出た人は、以下のようにrewrite_javascriptを無効にしてみて。
ModPagespeedDisableFilters rewrite_javascript
apacheを再起動して設定を有効化する。
$ /etc/init.d/apache2 restart
一通り、動作確認をして終了。
Show Slowなどを利用して、モジュールの組み込み前と後を比較するとおもしろい。
導入したサーバでmod_pagespeed_statisticsへの閲覧が初期設定では許可されている。
$ curl http://localhost/mod_pagespeed_statistics resource_fetches_cached: 32 resource_fetch_construct_successes: 0 resource_fetch_construct_failures: 0 total_page_load_ms: 0 page_load_count: 0 cache_extensions: 42 not_cacheable: 0 css_file_count_reduction: 0 css_filter_files_minified: 34 css_filter_minified_bytes_saved: 30984 css_filter_parse_failures: 33 css_elements: 0 image_inline: 190 image_rewrite_saved_bytes: 440452 image_rewrites: 19 image_ongoing_rewrites: 0 javascript_blocks_minified: 170 javascript_bytes_saved: 208633 javascript_minification_failures: 1 javascript_total_blocks: 185 resource_url_domain_rejections: 652 url_trims: 0 url_trim_saved_bytes: 0 resource_404_count: 0 slurp_404_count: 0 serf_fetch_request_count: 77 serf_fetch_bytes_count: 1922757 serf_fetch_time_duration_ms: 4192 serf_fetch_cancel_count: 0 serf_fetch_outstanding_count: 0 serf_fetch_timeout_count: 0
このようにmod_pagespeedの統計情報を見ることができる。(*2)
設定が効果的なのか一つの指標にすると良い。
VPSとかサーバを外部監視してますか?
・apacheの設定ミスに気づかず、一部VirtualHostが外部から見えない
・クライアントの回線が悪いのかVPSの回線が通信障害なのかの切り分け
・ドメインの有効期限切れに気づかず失効
こんなことを防ぐためにも、外部監視はしておいたことに越したことはない。
無料で外部監視ができるサイトをいくつか調べてみた。
僕が選んだのはライブドアデータホテルパトロールだ。
AlertMeはSSHのポート指定を監視できないから論外。
というより、あまりGMOに良いイメージがない。
cman.jpに関してもいまいち信用におけなかったので、
独自の監視ツールで実運用をしているライブドアデータホテルパトロールを利用してVPSを監視することにした。
SNMPの値を取ってこれるのも良い。ライブドア++
これで、何かあれば携帯にメールが来るからすぐに対応できる。
gumiStudy#2にいってきました。@kazeburoさんのmemcachedに関するお話し。
まとめちゃうと、memcachedを知り尽くすにまとめてあるのだ!
オススメ起動オプションとか
$ ./memcached -c 32768 -u nobody -C -m 16GB -p 11211 -U 0
mixiの大規模障害とかあった後だから、今が熱いmemcachedでした。
@kazeburoさんが開発しているリソースモニタリングフレームワークであるcloudforcastのお話しがありました。詳しくはYAPC::2010でお話しするようです。yamlでさくさくっと設定できるようなので便利そうでした。
Membaseは遅い。Redisをつかえ!
memcachedと入れ替えたら遅い遅い。
でも、今後に期待。
VMware ESXiの仮想サーバがHDD容量不足になったので増やす。
LVMで構築されているLinuxを前提としている。
(大抵の最近のLinuxはこれだから大丈夫でしょ)
[bash]
[root@localhost ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
39486856 2709764 34738924 8% /
/dev/sda1 101086 19284 76583 21% /boot
tmpfs 255292 0 255292 0% /dev/shm
[root@localhost ~]# fdisk -l /dev/sda
Disk /dev/sda: 42.9 GB, 42949672960 bytes
255 heads, 63 sectors/track, 5221 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 5221 41833260 8e Linux LVM
[/bash]
VMware ESXにて該当するHDDの容量を増やす。
スナップショットが有効だと増やせない。
増やしたい場合は、今までのスナップショットを全て破棄する必要がある。
[bash] [root@localhost ~]# fdisk -l /dev/sda Disk /dev/sda: 64.4 GB, 64424509440 bytes 255 heads, 63 sectors/track, 7832 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sda1 * 1 13 104391 83 Linux /dev/sda2 14 5221 41833260 8e Linux LVM [/bash]
HDDの総容量が増えていることを確認。
[bash] Command (m for help): p Disk /dev/sda: 64.4 GB, 64424509440 bytes 255 heads, 63 sectors/track, 7832 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sda1 * 1 13 104391 83 Linux /dev/sda2 14 5221 41833260 8e Linux LVM Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 3 First cylinder (5222-7832, default 5222): Using default value 5222 Last cylinder or +size or +sizeM or +sizeK (5222-7832, default 7832): Using default value 7832 Command (m for help): p Disk /dev/sda: 64.4 GB, 64424509440 bytes 255 heads, 63 sectors/track, 7832 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sda1 * 1 13 104391 83 Linux /dev/sda2 14 5221 41833260 8e Linux LVM /dev/sda3 5222 7832 20972857+ 83 Linux Command (m for help): t Partition number (1-4): 3 Hex code (type L to list codes): 8e Changed system type of partition 3 to 8e (Linux LVM) Command (m for help): p Disk /dev/sda: 64.4 GB, 64424509440 bytes 255 heads, 63 sectors/track, 7832 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sda1 * 1 13 104391 83 Linux /dev/sda2 14 5221 41833260 8e Linux LVM /dev/sda3 5222 7832 20972857+ 8e Linux LVM Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. WARNING: Re-reading the partition table failed with error 16: Device or resource busy. The kernel still uses the old table. The new table will be used at the next reboot. Syncing disks. [/bash]
ココで再起動
[bash]
# pvcreate /dev/sda3
# vgextend VolGroup00 /dev/sda3
# lvextend -L +20G /dev/VolGroup00/LogVol00
# resize2fs -p /dev/VolGroup00/LogVol00
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
58G 2.6G 52G 5% /
/dev/sda1 99M 19M 75M 21% /boot
tmpfs 250M 0 250M 0% /dev/shm
[/bash]
以上で終了。
VMwareESXiを動かすためだけに勢いで買ったDELL PowerEdge T105にHDDを2個買ってきて、自宅サーバとして生かすことにする。
パソコンの部品は購入したら不良がないかをチェックしないといけません。OSを入れてから不良セクタが見つかったりしたら、目も当てられません。正常に動作しなければメーカーに交換してもらう必要があるので、データを入れる前に必ずチェックします。
KNOPPIXをブートして、ターミナルを立ち上げて、
$ badblocks -c 512 -t random -fwvs /dev/sda$ badblocks -c 512 -t random -fwvs /dev/sdc
全てのテストが正常に終了すればOK。エラーが出たらメーカー交換。
今回購入したWestern Degital WD20EARSというHDDは「Advanced Format Technology」が採用されている。簡単に言うと従来のHDDは1セクタが512バイトだったのを4096バイトで扱おうって技術。通称Bigsector
要するにファイルシステムの開始セクタを8の倍数に設定しておけばOKってことだけど、Ubuntu10.04LTSではパーティション境界を1 MiB (1048576 bytes)地点から開始するので、何も考えずにパーティションを新規作成すればOK
Debianの文化に尊敬の意を表してUbuntuを使います。UbuntuのLTS版は10.04となっていて、サーバ版は2015年4月までサポートされる予定です。安定して稼働し続けさせるためには心強い。
まぁ、2015年になったらサーバを買い換えていると思うので、基本的にOSを入れたら再度そのHWにOSを入れることはほぼありません。
外部公開部分にはKVM上でCentOSを利用して外部公開しようと考えています。
普通にOSインストールです。OpenSSH Serverのみ選択して粛々と終了。
GRUB2が入らなかったので、とりあえずLILOをいれとく。
hiroki@t105:~$ df -hFilesystem Size Used Avail Use% Mounted on
/dev/mapper/VG1-root 1.8T 854M 1.7T 1% /
none 2.0G 176K 2.0G 1% /dev
none 2.0G 0 2.0G 0% /dev/shm
none 2.0G 36K 2.0G 1% /var/run
none 2.0G 0 2.0G 0% /var/lock
none 2.0G 0 2.0G 0% /lib/init/rw
none 1.8T 854M 1.7T 1% /var/lib/ureadahead/debugfs
/dev/mapper/VG1-boot 237M 24M 201M 11% /boot
hiroki@t105:~$ sudo lvdisplay /dev/mapper/VG1
- Logical volume —
LV Name /dev/VG1/boot
VG Name VG1
LV UUID B1TXJ2-Z0Hn-l0NB-xtUg-Z53K-BrLq-sqyD3b
LV Write Access read/write
LV Status available
# open 1
LV Size 244.00 MiB
Current LE 61
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 251:0
- Logical volume —
LV Name /dev/VG1/swap
VG Name VG1
LV UUID dviFr7-gbLh-si56-y2YK-Kpd3-6MnW-UJUlVk
LV Write Access read/write
LV Status available
# open 1
LV Size 3.81 GiB
Current LE 976
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 251:1
- Logical volume —
LV Name /dev/VG1/root
VG Name VG1
LV UUID JCTRvJ-wMJR-RY7p-2D9t-K29e-RTGJ-Hv422v
LV Write Access read/write
LV Status available
# open 1
LV Size 1.82 TiB
Current LE 475894
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 251:2
hiroki@t105:~$ cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sdb1[1] sda1[0]
1953513408 blocks [2/2] [UU]
unused devices: <none>
hiroki@t105:~$ sudo /sbin/hdparm -ft /dev/mapper/VG1-root
/dev/mapper/VG1-root:
Timing buffered disk reads: 304 MB in 3.02 seconds = 100.68 MB/sec
hiroki@t105:~$ uname -a
Linux t105 2.6.32-21-server #32-Ubuntu SMP Fri Apr 16 09:17:34 UTC 2010 x86_64 GNU/Linux
最初のHDDのMBRにしかブートローダーを書いていないので、後ほど次のHDDにも書くことにする。
OSの設定などは後日。