varnish 2.x → 4.x 移行したら遅くなった(ベンチ的に)

varnish 2.1.5 を単一サイトでちょっと使ってました。

んで、まぁちゃんと使うならきちんと新しいバージョンにしたいよね、と思い
4系にバージョンアップ。

移行前:varnish 2.1.5 (CentOS 6 epelで入るもの)
移行後:varnish 4.0.3 (varnish 公式サイトのyumリポジトリから入るrpm)


あくまでもabを使った簡易的なベンチマークですが以下のような感じ。


varnish 4

Server Software:        Apache
Server Hostname:        127.0.0.1
Server Port:            80

Document Path:          /
Document Length:        9033 bytes

Concurrency Level:      900
Time taken for tests:   0.744 seconds
Complete requests:      6000
Failed requests:        0
Write errors:           0
Total transferred:      57683104 bytes
HTML transferred:       55778775 bytes
Requests per second:    8065.35 [#/sec] (mean)
Time per request:       111.588 [ms] (mean)
Time per request:       0.124 [ms] (mean, across all concurrent requests)
Transfer rate:          75721.76 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0   48   5.1     50      55
Processing:    28   58  13.8     61     104
Waiting:        0   31  12.0     30      68
Total:         74  106  13.1    109     154

dockerのイメージを壊した話。

dockerで遊んでいたところ。

/bin/bash: error while loading shared libraries: /lib64/libtinfo.so.5: invalid ELF header


むむむ。
何も出来なくなった。


ここで、dockerのイメージ管理について簡単に説明。
詳細は http://enakai00.hatenablog.com/entry/20140420/1397981156 とかで。


ざっくり言うと、100GBくらいの巨大なファイルの中にベースとなるOSのイメージと、
各コンテナのイメージ差分が格納されている。(はず)

[root@docker-host ~]# ls -aldh /var/lib/docker/devicemapper/devicemapper/data
-rw------- 1 root root 100G Jul 17 14:55 /var/lib/docker/devicemapper/devicemapper/data


先ほどの記事に倣ってマウントしてみる。
今回はdc934b46cab6を。

[root@docker-host ~]# docker ps -a
CONTAINER ID        IMAGE                  COMMAND             CREATED             STATUS                      PORTS               NAMES
dc934b46cab6        centos:6-build-test2   "/bin/bash -l"      9 days ago          Exited (127) 20 hours ago                       prickly_colden
e3992f5f8eac        centos:6-build-test2   "/bin/bash -l"      2 weeks ago         Exited (130) 2 weeks ago                        elegant_jang
[root@docker-host ~]# cat /var/lib/docker/devicemapper/metadata/dc934b46cab6618f155c5d298bfb5b0ec67960e4c3889b2076c9c42ab749d554
{"device_id":162,"size":10737418240,"transaction_id":497,"initialized":false}
[root@docker-host ~]# ls -ald /dev/mapper/docker-*
lrwxrwxrwx 1 root root 7 Jun 29 20:03 /dev/mapper/docker-252:3-13370648-pool -> ../dm-0
[root@docker-host ~]# device_id=162
[root@docker-host ~]# size=10737418240
[root@docker-host ~]# pool=docker-252:3-13370648-pool
[root@docker-host ~]# dmsetup create myvol --table "0 $(($size / 512)) thin /dev/mapper/$pool $device_id"
[root@docker-host ~]# mount /dev/mapper/myvol /mnt
[root@docker-host ~]# mount | grep -F /dev/mapper/myvol
/dev/mapper/myvol on /mnt type ext4 (rw)
[root@docker-host ~]# df -h /mnt
Filesystem         Size  Used Avail Use% Mounted on
/dev/mapper/myvol  9.9G  702M  8.7G   8% /mnt

マウント出来たのでdockerの中のファイルがどうなってしまったのか見てみる。

[root@docker-host ~]# chroot /mnt/rootfs/ /bin/bash
/bin/bash: error while loading shared libraries: /lib64/libtinfo.so.5: invalid ELF header
[root@docker-host ~]# ls -al /mnt/rootfs/lib64/libtinfo.so.5
lrwxrwxrwx 1 root root 15 Jun 16 04:19 /mnt/rootfs/lib64/libtinfo.so.5 -> libtinfo.so.5.7
[root@docker-host ~]# ls -al /mnt/rootfs/lib64/libtinfo.so.5.7
  • rwxr-xr-x 1 root root 135896 Aug 19 2010 /mnt/rootfs/lib64/libtinfo.so.5.7
[root@docker-host ~]# cat -A /mnt/rootfs/lib64/libtinfo.so.5.7 | head -n1 | cut -b1-120 ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@

むむむ。。

ちなみにこれがホスト環境側のファイル。

[root@docker-host ~]# cat -A /lib64/libtinfo.so.5.7 | head -n1 | cut -b1-120
^?ELF^B^A^A^@^@^@^@^@^@^@^@^@^C^@>^@^A^@^@^@@M-H@C0^@^@^@@^@^@^@^@^@^@^@M-(^T^B^@^@^@^@^@^@^@^@^@@^@8^@^F^@@^@^^^@^]^@^A

ELFヘッダも確認できる正常なファイル。

ということで、dockerの中のファイルが壊れてしまったことは確認できたのだがこれ以上どうしようもないようだ。

ファイルの変更された日を知りたい。

lsで表示される日時や、mtimeは偽装が可能。

悪いことされたファイルについては、ctimeを見るほうが良い。
と思ってたのだけれども、、、、、
chmodしてもctimeが更新されるのね。

http://d.hatena.ne.jp/kakurasan/20070829/p1

WordPress+CloudFlare

WordPressを使う場合、wp-login.phpへアクセス可能な
アクセス元を制限するのはほぼ必須。

CloudFlareを併用して、かつ wp-login.phpに制限を掛ける場合は
こんな感じで .htaccess 書いておくと安心

<Files wp-login.php>
SetEnvIf Cf-Ipcountry 'JP' from_JP=1

Order deny,allow
Deny  from all
Allow from env=from_JP
</Files>

まだまだハマるよ。(環境依存文字)

むむむむむむむ。

http://snowland.net/nucleus/item/3355

カッコ株はiso-2022-jpにありませんよ。
って話。よく使われる文字だけ変換テーブルに掛けるべか。

って、思ったんだけど、
http://route477.net/d/?date=20110119
お、、、、

もっと簡単な方法がある。String#encodeにオプションを渡すと、不正なバイト列の扱いを指定することができる。
例えば以下のようにすると、不正なバイト列や変換が未定義のバイト列は適当な記号で置き換えられる。

html = open(url, "r:euc-jp").read.encode("utf-8", :invalid => :replace, :undef => :replace)


これでこの件も解決かなぁ。