動かざることバグの如し

静かに頬を伝う涙が 私に知らせる これが初恋と

OpenCVビルドメモ

sudo apt-get update
sudo apt-get install -y build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
sudo apt-get install -y python2.7-dev python3.6-dev python-dev python-numpy python3-numpy
sudo apt-get install -y libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev libjasper-dev
sudo apt-get install -y libv4l-dev v4l-utils qv4l2 v4l2ucp
sudo apt-get install -y curl
sudo apt-get install -y zlib1g-dev libjpeg-dev libwebp-dev libpng-dev libtiff5-dev libjasper-dev libopenexr-dev libgdal-dev



cmake -D WITH_GSTREAMER=ON -D WITH_LIBV4L=ON -D BUILD_opencv_python2=ON -D BUILD_opencv_python3=ON -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..

MySQLでToo many connectionsの原因クエリ特定の対処法

環境

症状

max_connectionsの設定を大きくしているのにもかかわらず、なんらか悪いSQLが走ってしまってテーブルがロックしてしていまい「Too many connections」エラーになる。

対応方法

まずは焦らずロックの原因になってしまっているSQLを(あとからでもいいので)特定できるように保存する

先に詰まってるクエリ一覧をバックアップ

mysql -p  -e 'show full processlist' > sql_list.txt

fullをつけないとSQLが省略されてしまうので注意

次にいったん全クエリをkillしてToo many connectionsを解消する。以下のコマンドを実行

mysql -p  -e 'select concat("KILL ",id,";") from information_schema.processlist;' -s

するとKILL プロセスIDをリストがバーっと出力される。

concat("KILL",id,";")
KILL 202718241;
KILL 202718240;
KILL 202718239;
KILL 202718238;
KILL 202718237;
KILL 202718236;
(略)

これをコピーして対象のMySQLサーバーにログインしてコピペ実行すれば一旦は全クエリが中止される。

そして最初に保存したsql_list.txtを確認して、悪いSQLを特定していく おわり

蛇足

現在のコネクション数 show processlistの行とほぼ一致するはず

show variables like "%max_connections%";

MySQLのコネクション数を増やす設定

mysql> set global max_connections = XXXX;

Tensorflow+kerasで機械学習する時にCPUが多いと遅い件

概要

どういうわけか、CPUが多いサーバーだと学習に時間がかかるんじゃないかという話があった。そんなことないやろと思いつつ、公平にAWSベンチマークを撮ってみたが、やはりCPU数が多ければ多いほど遅くなってしまう。。

検証環境

nvidia-dockerを使ってCUDAの環境を構築し、その中でkeras公式レポジトリ内のexampleコードを実行して掛かった時間を計測する。

ちなみにgithubのレポジトリを使うとそれらがスクリプト化されている。

git clone https://github.com/thr3a/gpu.git
cd gpu
make build
make benchmark1 CPUS=0-1 # 使用するコアをCPUSで渡す デフォルト0のみ

babi_rnn.pyを実行したときのベンチマーク結果

FacebookのbAbIデータセットを用いた学習 自然言語処理系のはず

CPU数1個の場合

  • かかった時間 8分44秒
  • 1エポックあたりの平均 25秒

CPU数2個の場合

  • かかった時間 7分23秒
  • 1エポックあたりの平均 21〜22秒

CPU数4個の場合

  • かかった時間 7分37秒
  • 1エポックあたりの平均 22秒

CPU数8個の場合

  • かかった時間 8分06秒
  • 1エポックあたりの平均 24秒

結果2コアが1番速く終わることになる

cifar10_cnn.pyを実行したときのベンチマーク結果

いわゆる画像分類

CPU数1個の場合

  • かかった時間 5分18秒
  • 1エポックあたりの平均 31秒

CPU数2個の場合

  • かかった時間 4分14秒
  • 1エポックあたりの平均 25秒

CPU数4個の場合

  • かかった時間 4分40秒
  • 1エポックあたりの平均 27秒

CPU数8個の場合

  • かかった時間 5分11秒
  • 1エポックあたりの平均 30秒

これも2コアが一番速かった

結果

2つのベンチマークを表にすると以下

babi_rnn.py cifar10_cnn.py
1コア 8:44 5:18
2コア 7:23 4:14
4コア 7:37 4:40
8コア 8:06 5:11

うーんなにかUbuntu側の設定の問題なのか、Tensorflow(or keras)の仕様なのか、、謎

mysqlslapでMySQLサーバーの負荷テストをサクッと行う

環境

実はMariaDBにも同じコマンドが入っていたので仕様同じで使えるはず

やりたいこと

MySQLサーバーの負荷テストを「手軽」に行いたい

やれやれまたツールの選定作業か、、と思って探していたらどうも公式がツールを「mysqlslap」という名前で出しているらしい。てか入ってた。サンキューイルカ

公式ドキュメントいわく、

mysqlslap は MySQL サーバーのクライアント負荷をエミュレートし、各段階のタイミングをレポートする診断プログラムです。複数のクライアントがサーバーにアクセスしているかのように作動します。

とのこと。ポイントは「自動で負荷用のダミーDB、SQL」を生成してくれるところだと思う。

インストール

mysql-clientインストールしたら勝手に入ってると思う

実行

基本構文は以下

time mysqlslap \
--user=root \
--password=pass \
--engine=innodb \
--concurrency=10 \
--iterations=20 \
--auto-generate-sql \
--auto-generate-sql-load-type=mixed \
--number-char-cols=20 \
--number-int-cols=20 \
--auto-generate-sql-write-number=100000

各オプションの説明は以下

  • --user ユーザー名
  • --password パスワード 今回はローカル対象だが、別ホストを対象にテストをする場合は--hostが必要
  • --engine=innodb ストレージエンジン myisamとか
  • --concurrency 同時接続数 多くのユーザーからアクセスされていることを想定するならここの値を増やす
  • --iterations SQLの実行を何回行うか
  • --auto-generate-sql SQLを自動生成する
  • --auto-generate-sql-load-type=mixed INSERTとSELECT、UPDATEのコマンドをそれぞれ行う
  • --number-char-cols 1レコード内のVARCHAR型のカラム数
  • --number-int-cols 1レコード内のINT型のカラム数
  • --auto-generate-sql-write-number 最初にダミーデータを用意する際、レコードをどれだけ用意するか デフォルトだとかなり少ないので設定推奨

他にもオプションはいっぱいあるので公式ドキュメントをご覧くださいとしかいいようがない

実際に負荷テストする前にSQLを確認したい

オプションに --only-print をつけて実行するとSQLがバーっと術力される。

工夫すれば自前SQLでテストもできるらしいが、サクッとやるぶんにはauto-generate-sqlでも十分だと思った。

Unixドメインソケットをコマンドから生成する

一生に1回くらいの頻度で、Unixドメインソケットを自分で作りたいと思うことがあるはず(ない

コマンド

調べてみると、意外にもLinuxのコマンドでは生成できないらしい。

で、何故かPythonで作れた /tmp/test.sockに作りたいUnixドメインソケットの絶対パスを書く

python -c "import socket as s; sock = s.socket(s.AF_UNIX); sock.bind('/tmp/test.sock')"

他の言語でもできるっぽいけどPythonは必ずOSに入っているはずだから、メンテしやすいのかな、と。

そもそもなんでUnixドメインソケットをコマンドで作成する必要になったか覚えてないんだけど(

参考リンク