Node.js のプロセスマネージャー PM2 でよく使うコマンドまとめ

PM2 でよく使うコマンドのメモ.

pm2.keymetrics.io

list

$ pm2 list

PM2 を使って管理しているプロセスの一覧がみれる.

show

$ pm2 show $APP_NAME

App Name を指定することで list より詳しい情報がみれる.

┌───────────────────┬──────────────────────────────────────────────────┐
│ status            │ online                                           │
│ name              │ app                                              │
│ restarts          │ 0                                                │
│ uptime            │ 6h                                               │
│ script path       │ /home/ubuntu/app/app.js                          │
│ script args       │ N/A                                              │
│ error log path    │ /home/ubuntu/.pm2/logs/app-error-0.log           │
│ out log path      │ /home/ubuntu/.pm2/logs/app-out-0.log             │
│ pid path          │ /home/ubuntu/.pm2/pids/app-0.pid                 │
│ interpreter       │ node                                             │
│ interpreter args  │ N/A                                              │
│ script id         │ 0                                                │
│ exec cwd          │ /home/ubuntu/app                                 │
│ exec mode         │ fork_mode                                        │
│ node.js version   │ 8.9.4                                            │
│ watch & reload    │ ✘                                                │
│ unstable restarts │ 0                                                │
│ created at        │ 2018-01-30T04:49:08.286Z                         │
└───────────────────┴──────────────────────────────────────────────────┘

logs

$ pm2 logs $APP_NAME

PM2 はデフォルト設定では $HOME/.pm2/logs/ 配下にログが格納される.

logs コマンドを使うと, わざわざ tail したりしなくて良い.

--watch

# pm2 start $APP_NAME --watch

App があるディレクトリ / サブディレクトリのファイルが変更されると

自動的にプロセスを再起動する.

※ --watch での再起動は graceful ではないので注意.

gracefulReload

$ pm2 gracefulReload $APP_NAME

稼働中のプロセスを正常に(処理が終了してから)終了して再読込する.

save

$ pm2 save

PM2 で管理しているプロセスを起動時に立ち上がるように保存する.

/home/$USER/.pm2/dump.pm2 にどんな内容で立ち上げるかが保存される.

内部的には環境に応じた init システムを検出して登録している.

    var hash_map = {
      'systemctl'  : 'systemd',
      'update-rc.d': 'upstart',
      'chkconfig'  : 'systemv',
      'rc-update'  : 'openrc',
      'launchctl'  : 'launchd',
      'sysrc'      : 'rcd'
    };

github.com

調べてもわからなかったこと

$ pm2 start pm2-config.json --env production

↑ で起動した時に, あとから --env に指定した内容を確認する方法.

質問してみたので, わかりしだい追記予定.

github.com

LINE Developer Meetup で「Messaging API の活用最前線」という発表してきた

「LINE Developer Meetup in Kyoto#26」で発表をしてきた!

line.connpass.com

発表資料

タイトルは「Messaging API の活用最前線」

最初は「~~~による Messaging API 活用事例」という感じのタイトルだったのを

社内メンバーから「長くて弱気」とフィードバックもらったので,「シンプルで強気」なタイトルに変更してのぞんだ.

speakerdeck.com

感想 / 補足など

実際に LINE Bot を"作った経験がある人"と"興味はあるけどまだ作ったことない人"が50:50ぐらいかなと予想し

  1. ボットはオウム返し以外にも活用の方法があると感じて(作りたくなって)もらうこと
  2. 実際にボットを作っていくとぶち当たる(かもしれない)壁の攻略方法

を伝えることを意識した.

セッションの最初に「ボット作ったことある方どれぐらいいますか?」と質問したところ 40~50%ぐらいの方が手を上げてくれて, 読みが当たったなと心のなかでガッツポーズしていた!

ジョークとして仕込んだ自分の LINE Bot を作っていったくだりが, あまりウケてなかったのは改善していきたい. ( 終了後にメッセージくれた方がいたのはすごく嬉しかった!)

他セッション

サーバーレスアーキテクチャでLINE BOTの商用サービスを作った話 / @UniOce

www.slideshare.net

感想

ボット開発はシステム実装だけでなく, ボット(のキャラクター)とユーザーとのコミュニケーションをどう築いていくかが重要.

大きめのアーキテクチャ図で全体構造を見せて, 今ここの話ですとやっていくスタイル真似したい.

チャットボットの定義と設計 / @uta_tti

www.slideshare.net

感想

新しく出てきた技術は人や立場によって定義が異なる( 出始めの頃のクラウドとかサーバーレスとか )ので, 定義決めて話すのは大事.

プレゼン中に何が起きても, 最後まで突き進んでいくハートの強さが光っていた.

【LINE APIの新機能を使った栄養士Botのライブデモとその裏側解説】 / @nkjm

( 資料探し中 )

感想

LINE Pay と連携してボット内だけでユーザーのストレス無く, フリーミアムを確立させてしまうのは驚きだった.

この形でビジネスをやる企業が増えていきそう.

まとめ

いつもと違う場所(京都!)で違う立場(聴講者ではなく発表者)で

イベントに参加できたのはとても新鮮で刺激的だった!

アウトプットを増やしていく1年にすると決めて, 1月から登壇できたのでこのまま失速せずに継続していきたい.

Node.js 6系と8系の LTS でパフォーマンス比較してみた

Node.js 8.9.0 が LTS としてリリースされて数ヶ月がたち

そろそろ実戦投入していきたいのでパフォーマンスを計測/比較してみた.

実行環境

  • AWS EC2 m3.medium インスタンス
  • Ubuntu 16.04.3
Node.js
  • 6系 - 6.12.3
  • 8系 - 8.9.4

ベンチマークコード

シンプルに json を返すだけの処理で実施.

var http = require('http');

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'application/json'});
    res.write(JSON.stringify({result: 'success'}));
    res.end();
}).listen(8080);

github.com

パフォーマンステストの方法

  • Apache Bench を使用
  • 10万リクエスト
  • 並列数を変えながら(10 ~ 5000), かかった時間を計測
  • 各並列数で3回実行した平均値を計測値とする
 ab -n 100000 -c 5000 http://ec2-xxx/

途中で Too many open files が出たので ulimit -n 10240 で上限値を増やした.

結果

f:id:morugu:20180121170002p:plain

f:id:morugu:20180121170015p:plain

まとめ

平均で 14%のパフォーマンス向上 が確認できた.

実戦投入に向けて

  • Cluster を使用
  • 重い処理
  • DBアクセス
  • シナリオテスト

あたりの検証もしていきたい.

おまけ

「なんで速くなってるの?」というところで

Node.js 本体とその実行環境である V8 JavaScript engine が改善されているからなのだけど

それらが具体的にどう改善されたかわかるまとめ.

(このあたりのコードを読んだ解説記事も書きたい)

http: improve outgoing string write performance by mscdex · Pull Request #13013 · nodejs/node · GitHub

lib,src: improve writev() performance for Buffers by mscdex · Pull Request #13187 · nodejs/node · GitHub

querystring: improve querystring unescapeBuffer perf by jseijas · Pull Request #12525 · nodejs/node · GitHub

stream: improve readable push performance by mscdex · Pull Request #13113 · nodejs/node · GitHub

v8project.blogspot.jp

react-native run-* で error during initialization or failure to call AppRegistry.registerComponent の対策

エラーログ

APP_NAME has not been registered.
This is either due to a required() error during initialization or failure to call AppRegistry.registerComponent

対策

node プロセスが干渉しているので kill する.

$ ps aux | grep node
$ sudo kill -9 PROCESS_ID

参考

https://github.com/jhabdas/react-native-webpack-starter-kit/issues/30#issuecomment-180838137

react プロセスのパターンもあるみたい.

react−nativeの最初につまずいたところメモφ(。_。 ) - Qiita

input type="file" accept で .m4a 形式のファイルをデフォルトの選択対象にする場合は audio/x-m4a を使う

タイトルが本文.

実現したかったこと

<input type="file">

でデフォルトでは .m4a 形式のファイルだけを選択対象にする.

.m4a とは

非圧縮ファイル(WAVやAIFF)を音質の劣化なく70%から50%程圧縮する。通常はQuickTimeのMOVファイル(.mov)かMP4ファイル(.m4a)に格納される。

ロスレスで50%サイズダウンすごい.

試したこと

素直に <input type="file" accept="audio/m4a">

-> 全てのファイル形式が対象になる: ☓

あ, m4a は mp4 ベースの拡張だから <input type="file" accept="audio/mp4">

-> .mp4 が対象になる: ☓

-もう <input type="file" accept="audio/*"> で妥協しよう

-> ☓

結論

<input type="file" accept="audio/x-m4a">

なぞは残る

Media Types

developer.mozilla.org

あたりを探しても関する情報はなく...

help.dottoro.com

に audio/m4a の Aliases として audio/x-m4a があったので試してみたらいけた.

現行の Chrome 63 と Safari 11.0.2 では実現できた.

Web 標準ではないけど各ブラウザが実装している..?

優先度は高くないので, 時間あるときにでも調べていきたい.