最近サーバの勉強をしないとなあとふつふつと感じてる。
専用サーバかVPS借りてやらんといかんなーと。
暑い名古屋では自宅サーバは無理なのです。
電気代、固定IP代とかいろいろ含めると、外部で借りたくなるというもの。
で、サーバ管理で思い出すのが、とあるECサイトのお手伝いをした時に痛い目にあった事。
「ECサイトで鬱になる」その1
「ECサイトで鬱になる」その2
結局この案件はシステム会社さんへ引き継ぐことになった。(大分前)
僕の実力&経験不足で会社にもお客さんにもいろいろ迷惑かけました。
ということで、今回はあん時のログを見ながらVPSを使って痛い目にあったの時のログを振り返ろうかと。
まずは普段の状態でtopコマンド叩いたらこんな感じ。
#平穏時
top - 15:58:50 up 15 days, 17:24, 1 user, load average: 0.06, 0.11, 0.09
Tasks: 45 total, 1 running, 44 sleeping, 0 stopped, 0 zombie
Cpu(s): 1.8% us, 0.2% sy, 0.0% ni, 97.9% id, 0.2% wa, 0.0% hi, 0.0% si
Mem: 7783444k total, 7622528k used, 160916k free, 249076k buffers
Swap: 4192956k total, 1312k used, 4191644k free, 2846752k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 15 0 1704 616 528 S 0 0.0 0:42.78 init
7204 root 15 0 1608 552 460 S 0 0.0 0:19.34 syslogd
7208 root 18 0 1560 392 320 S 0 0.0 0:00.00 klogd
7236 root 15 0 2160 832 688 S 0 0.0 0:27.13 xinetd
7255 root 18 0 2224 1148 980 S 0 0.0 0:00.01 mysqld_safe
7294 mysql 18 0 95740 17m 3668 S 0 0.2 36:21.65 mysqld
7336 postgres 18 0 15448 2640 2324 S 0 0.0 0:03.49 postmaster
7344 postgres 15 0 15448 900 576 S 0 0.0 4:58.07 postmaster
7345 postgres 15 0 6228 728 408 S 0 0.0 0:19.57 postmaster
7346 postgres 18 0 5452 908 464 S 0 0.0 0:00.00 postmaster
メモリーはサーバ全体で載ってる8GBと表示されてる模様。
そのうち割り当てられていたのが、1.5GBぐらい。
CPUはどうなんだろ、サーバ全体の様子が出ているのかな?
ともあれload averageを見ての通り平和ですよ、平和。
次はテレビで放送された日のtopコマンドの結果がこちら。
#カオス時
top - 16:56:55 up 17 days, 18:22, 1 user, load average: 38.18, 35.37, 33.50
Tasks: 83 total, 6 running, 77 sleeping, 0 stopped, 0 zombie
Cpu(s): 70.1% us, 4.0% sy, 0.0% ni, 25.0% id, 0.9% wa, 0.0% hi, 0.0% si
Mem: 7783444k total, 7469416k used, 314028k free, 168584k buffers
Swap: 4192956k total, 1180k used, 4191776k free, 2543672k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11635 apache 16 0 36840 18m 3504 D 15 0.2 0:02.82 httpd
3543 apache 16 0 36916 18m 3924 D 12 0.2 0:22.78 httpd
6072 apache 18 0 37208 18m 3800 D 12 0.2 0:19.85 httpd
21672 apache 15 0 37564 19m 4080 S 11 0.3 1:42.23 httpd
13502 apache 16 0 36700 17m 3324 D 10 0.2 0:01.46 httpd
24038 apache 16 0 36800 18m 3984 D 10 0.2 0:35.20 httpd
32667 apache 16 0 36768 18m 4080 D 10 0.2 0:52.75 httpd
12171 apache 16 0 36660 18m 4084 D 9 0.2 1:34.54 httpd
5393 apache 15 0 38260 20m 4092 D 8 0.3 1:47.14 httpd
14090 apache 15 0 37268 19m 4040 D 8 0.3 1:36.27 httpd
21619 apache 16 0 36824 18m 4052 D 6 0.2 1:10.11 httpd
load averageが38とか無いわー。
もうhttpdのプロセスだらけ。
netstatでアクセスしてきてるクライアント数をチェック。
netstat -n | grep ':80'| grep -v TIME_WAIT |wc
493 2958 43877
500程度。
でも、ApacheのMaxClientsはというと・・・
[httpd.conf]
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 50
MaxRequestsPerChild 4000
悲惨。
CPUに負荷がかかりまくっている原因はいろいろあるらしいんだけど、メモリかなーと思って見てみる。
普通はfreeコマンドとかで良いんだろうけど、VPSでVirtuozzo/OpenVZだと、こんなコマンドでみられるらしい。
cat /proc/user_beancounters
Version: 2.5
uid resource held maxheld barrier limit failcnt
2083002413: kmemsize 15159774 16562463 30793728 33865728 0
lockedpages 0 6 50 50 0
privvmpages 174706 198048 393216 412877 0
shmpages 4616 7192 98304 98304 0
dummy 0 0 0 0 0
numproc 103 124 300 300 0
physpages 109650 128926 0 2147483647 0
vmguarpages 0 0 131072 2147483647 0
oomguarpages 109660 128936 32768 2147483647 0
numtcpsock 213 346 768 768 0
numflock 18 61 2048 2048 0
numpty 1 4 48 48 0
numsiginfo 0 54 200 200 0
tcpsndbuf 620224 4845588 4718592 6684672 361494838
tcprcvbuf 676344 1310696 4718592 6684672 0
othersockbuf 23904 190512 4915200 6963200 0
dgramrcvbuf 0 9560 6291456 6291456 0
numothersock 45 94 800 800 0
dcachesize 226024 273685 3145728 3145728 0
numfile 1961 2424 8192 8192 0
dummy 0 0 0 0 0
dummy 0 0 0 0 0
dummy 0 0 0 0 0
numiptent 14 14 400 400 0
tcpsndbufのfailcntはまあ良いとして(良くないけど、過去の値っぽいので)。
メモリーは足りてそう。
となるとネットワークかディスクI/Oか。
この時、アプリケーション側でMySQLの最大同時接続数エラーでまくり。
最大数が20だったのに、500クライアントも繋ぎにこればそりゃ駄目だわなー。
vmstatコマンド叩いた結果も見たかったんだけど、ログが見つからなかった。
もしかして見てないかも。
経験不足だなーてんぱってただろうしなあ。
キャッシュを上手く使いたかったけど、ECサイトという側面から、在庫数とかそういうのはリアルタイムで表示しないと駄目なわけで、なかなか上手いこと組み込めなかった。
CPUの負荷が上がっているのが、ネットワークやディスクI/Oが原因と分かったところで、こちらは手の打ちようが無かった。
あったかも知れんけど、僕には出来んかった。
結局は嵐が去るのを待っただけだったなあ。
これは僕の個人的な見解だけど、やっぱ根本的にサーバの性能が足りなかったなあと思った。
普通のHTMLを表示するだけでも、なんだかもたついている感じがしたし。
これで4万とか5万とか月々かかってるんだぜ?
専用サーバの方が明らかにコストパフォーマンス高いよなあ。
まあ、バックアップとかは向こうでやってくれたし、なんかあった時は相談に載ってくれたけど(大した答えは帰ってこなかったけど)
あと負荷対策で直ぐ思いつくのがロードバランサの利用だけど、そんなことやったこともないし。
試してみたくても費用がかかるし。
そもそも一般的なVPSサービスでロードバランサまで面倒見てくれるホスティング会社となると、かなり絞られるし。
もしそうなっても、セッションをDBで管理することになるのかもしれないので、プログラム修正しなかんし。
(これはロードバランサの機能でなんとかなるらしいけどさ)
とまあ、VPSに全く良い思い出が無いんだよね。
そもそも一番最初はメモリが256MBのプランだったんだけど、立ち挙げた瞬間からメモリ不足になるし。
まあ、最初からMLとか動いているからなんだろうけど、そこは切っておけよと。
とにかく全体的に動作ももっさりしている印象が強い。
国内のVPSは多分どこも同じ様な感じだと思うんだよなあ。
この頃よりは、それぞれ性能は上がっているだろうけどさ。
逆にさくらとかの共有サーバの高いプランの方が、下手なVPSより安定してんじゃないのかと思うのよね。
僕のプログラムがいかんかったのかなとも思うけど、んー、どうなんだろ。
結局のところは良くわからんけど、そんなこんなで海外のVPSを借りて、サーバ管理の経験を積みたいなと思っているのです。
海外のVPSならXenで月額20ドルとかあるしなー。
まあ、問い合わせが英語ってのが不安だけど、国内で借りてもVirtuozzo/OpenVZは嫌なんだよねー。
ということで振り返りでした。
※素人の戯言なので、間違っている点やもっとこうした方が良かったのにとかあれば教えてもらえたらと思います!