動かざることバグの如し

近づきたいよ 君の理想に

ヘッドレスブラウザPuppeteerで指定時間待たせる方法

いわゆるwait()とかsleep()とかdelay()って呼ばれてるやつ。

nightmareなら確かwait()だったかな?

Puppeteerくんには残念ながら今のところそういった便利関数の実装はないので自分で作る必要がある。

const puppeteer = require('puppeteer');

async function sleep(delay) {
  return new Promise(resolve => setTimeout(resolve, delay));
}

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('http://example.com/');
  await sleep(5000);
  await page.screenshot({path: 'example.png'});
  await browser.close();
})();

MySQLの圧縮機能 COMPRESSEDを試す

環境

  • ubuntu server 16.04
  • MariaDB 10
  • 検証に使ったデータはTwitterのサンプルストリーミングから取得したデータを使用
    • testdata1 未圧縮
    • testdata2 中身はtestdata1と同じだが圧縮済み

圧縮が使えるように設定

まずは設定を確認

MariaDB [(none)]> show variables like 'innodb_file%';
+--------------------------+-----------+
| Variable_name            | Value     |
+--------------------------+-----------+
| innodb_file_format       | Barracuda |
| innodb_file_format_check | ON        |
| innodb_file_format_max   | Barracuda |
| innodb_file_per_table    | ON        |
+--------------------------+-----------+
4 rows in set (0.00 sec)

innodb_file_per_tableが有効で innodb_file_formatが「Barracuda」になってなければならない。

なってない場合はmy.cnfにて

innodb_file_per_table = 1
innodb_file_format = Barracuda

を追加してMySQLを再起動

圧縮の有効化

くっそ簡単。通常のcreate table構文にROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8をつけるだけ

CREATE TABLE `testdata1` (
****
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;

すでにあるテーブルに対して圧縮機能を有効化する場合は以下

ALTER TABLE test ROW_FORMAT=Compressed KEY_BLOCK_SIZE=8;

容量

# du -ch testdata1*
8.0K    testdata1.frm
673M    testdata1.ibd
673M    合計
# du -ch testdata2*
8.0K    testdata2.frm
321M    testdata2.ibd
321M    合計

大体2分の1程度まで減ってる すごい

ベンチマーク

単純に limitを付けただけの場合のを1000回繰り返した場合

                 user     system      total        real
testdata1  255.690000  11.370000 267.060000 (326.304830)
testdata2  235.230000   9.600000 244.830000 (295.826843)

なんとtestdata2の圧縮したほうが速い

インデックスの効いたwhere句を30000回繰り返した場合

                 user     system      total        real
testdata1   23.390000   2.320000  25.710000 ( 54.533738)
testdata2   22.520000   2.090000  24.610000 ( 53.656592)

ほぼ同じ。。だがわずかに圧縮済みの方が速い

インデックスの効かないwhere句を10回繰り返した場合

                 user     system      total        real
testdata1   23.750000   2.620000  26.370000 (271.853630)
testdata2   23.980000   2.550000  26.530000 (321.524997)

こっちは圧倒的に未圧縮のほうが速い

結論

  • 圧縮すると約半分までデータ容量は減る
    • 型によって変わるから一概には言えないが
  • 圧縮した場合、indexの効かないwhereは遅くなる
    • が、それ以外はそうでもない
    • insert,updateは試せなかった(

Linuxでディスクに負荷をかけてるプロセスを特定したい

iotopコマンドの場合

rootないしはsudoが使える場合はこれが便利 名前の通りtopのごとく使える

# iotop
Total DISK READ :       0.00 B/s | Total DISK WRITE :     389.38 K/s
Actual DISK READ:       0.00 B/s | Actual DISK WRITE:     462.63 K/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                                                                      
 1526 be/4 mysql       0.00 B/s  370.11 K/s  0.00 %  0.92 % mysqld --basedir=/usr --datadir=/var/lib/mysql ~--socket=/var/run/mysqld/mysqld.sock --port=3306
 1508 be/4 mysql       0.00 B/s    0.00 B/s  0.00 %  0.84 % mysqld --basedir=/usr --datadir=/var/lib/mysql ~--socket=/var/run/mysqld/mysqld.sock --port=3306
  268 be/3 root        0.00 B/s    7.71 K/s  0.00 %  0.43 % [jbd2/sda1-8]
17918 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.12 % [kworker/u8:1]
 1524 be/4 mysql       0.00 B/s    3.86 K/s  0.00 %  0.00 % mysqld --basedir=/usr --datadir=/var/lib/mysql ~--socket=/var/run/mysqld/mysqld.sock --port=3306

なければインストールが必要

apt install iotop # ubuntu
yum install iotop # centos

dstatコマンドの場合

dstatコマンドで--top-bio オプションを付けるとIO負荷の高いプロセスをリアルタイムで出してくれる

# dstat --top-bio -a
----most-expensive---- ----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
  block i/o process   |usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw 
init         26k  199k|  4   1  80  15   0   0|  40k  289k|   0     0 |   8B   29B| 394   824 
rake get:ms   0    36k|  3   1   0  96   0   0|   0   120k| 688B 1514B|   0     0 | 328   493 
rake get:pa   0  8192B|  8   1   0  91   0   0|   0     0 |  40k 2322B|   0     0 | 368   495 
rake get:pa   0    44k|  1   1   0  98   0   0|  16k  204k|6350B 1739B|   0     0 | 247   476 
mysqld        0   420k|  8   1   0  91   0   0|   0   496k|  43k 1507B|   0     0 | 401   609 
rake get:ni   0    44k|  1   0   0  99   0   0|   0   124k|6377B 2115B|   0     0 | 206   369 
mysqld        0   132k|  8   1   0  91   0   0|   0   204k|  40k 1359B|   0     0 | 350   526 
mysqld       16k   40k|  2   0   0  98   0   0|  16k  272k|3581B 1259B|   0     0 | 302   584 
mysqld        0   516k|  7   0   0  93   0   0|   0   596k|  38k 2209B|   0     0 | 319   531 

Google Cloud SQLを個人利用するときの料金を試算してみた

VPS借りてその中にMySQL立ててDB運用しているが、ぶっちゃけ運用面倒なのでクラウドにぶん投げたら楽だなーと。

GoogleCloud SQLがピンときたので料金を詳しく見てみることにした。

  • MySQL 5.7互換
  • ディスク容量が勝手に増えていくので気にしなくていい
  • 昨年V2になって更に速くなった(らしい

利用ユース

料金の試算

繰り返すが、個人利用でお金が発生するものでもないので、気になるのはただただコスパ、料金である。

が相変わらずGoogleの公式ドキュメントは見づらい

インスタンスの料金

これがないと始まらない。一番安い米国リージョンで見てみる。

  • db-f1-micro(CPU共有 RAM0.6GB):0.01502430=10.8ドル、月額およそ1130円
  • db-g1-small(CPU共有 RAM1.7GB):0.03502430=25.2ドル、月額およそ2864円

ただし継続利用価格とやらがあって、それだと 0.01052430 =7.56ドルとなり月額約 859円(db-f1-micro) になる。

どの程度継続するとその価格になるのかは不明

MySQLでRAMが0.6MBって使い物になるのか・・?

ストレージの料金

Cloud SQLではSSDとHDDのどちらかが選べる。どちらも新規作成時に最低でも10GBは必要なので、仮に10GBでの料金を出す。

  • SSD: 0.17*10 = 1.7ドル 月額約 200円
  • HDD: 0.09*10 = 0.9ドル 月額約 102円

この価格差ならSSD選ぶかな。。。

ネットワーク転送料金

この辺はVPSにはない課金概念である。

  • 上り 無料
  • 下り 0.19ドル/GB(約20円)
  • ただし同リージョンにGCE(仮想マシン)を立ててその間との通信は無料

下りで1GB20円なら、多少ヘビーなクエリ投げても100円いくかどうかってレベルだと思う。

合計

例えばほどほどの使い方をしたとして

  • 1130円+200円+20円 = 1350円

ちょい多めに見て月額1500円程度といったところだろうか