0
0

Kubernetes上のNode.jsアプリケーションのHeapdump

Posted at

Kubernetes上のnode.jsアプリケーションでメモリーリークをしている可能性があったので、Heapdumpを取って解析をすることにしました。

どのようにKubernetes上のnode.jsアプリケーションのHeapdumpを取得したか紹介したいと思います。

Deploymentの変更

実際にある程度のロードがある状態でHeapdumpを取りたかったので、すでにデプロイされているDeploymentを少し変更して、そこからHeapdumpを取ることにしました。

本来はPodでNode.jsがスタートするように設定しますが、スタートのパラメータを変更したいので、一時的に

kubectl -n mynodejs edit deployment mynodejs

で以下のようにtail -f /dev/nullとかしてPodはスタートしてもNode.jsはスタートしないようにします。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mynodejs
  namespace: mynodejs
  labels:
    app: mynodejs
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mynodejs
  template:
    metadata:
      labels:
        app: mynodejs
    spec:
      containers:
      - name: mynodejs
        image: mynodejs:1.2.3
        command: ["/bin/bash", "-c"]
        args: 
          - tail -f /dev/null 

これでNode.jsのPodをデプロイして、自動的に開始されないようにできました。何かの都合でデバッグ中にNode.jsが止まってもPod自体は動き続けるので、再度Node.jsをスタートしてデバッグでき便利です。

Node.jsのスタートパラメータの変更

次にPod内のNode.jsにパラメータをつけてスタートします。

kubectl -n mynodejs exec mynodejs-1bw5d-1234 -it -- /bin/sh
node --inspect main.js

これによりデバッガーをアッタッチできるようになります。デフォルトで9229のポートを使っています。
image.png
Podのポート9299でデバッガーをアッタッチできる状態になりました。

ポート転送

次にポート転送を行ってデバッガーでHeapdumpを採取します。

kubectl -n mynodejs port-forward mynodejs-1bw5d-1234 9999:9229
Forwarding from 127.0.0.1:9999 -> 9229
Forwarding from [::1]:9999 -> 9229

この例ですとLocal hostの9999からNode.jsの9229に転送されます

Chrome DevTools

次にChrome DevToolsをつかってポート転送されたデータを採取します。
Chromeでchrome://inspectを開き
image.png

Configureボタンから転送ポートを設定
image.png

ポート転送の設定がうまく行くと画面がこのように変わります。
image.png

ここでinspectをクリックすると、デバッガーをアッタッチできます。
image.png

これでHeapdumpをとったり、実際のアクセスの状況をトレースできたりします。
image.png

Heapdumpをとるとこのように、何にどれだけメモリーが使用されているかわかります。
image.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0