🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

解決済

1回答

1137閲覧

execSyncでスクリプトを呼ぶとDBにプロセスが残ってしまう

shiro09

総合スコア19

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

1グッド

3クリップ

投稿2019/10/30 15:34

編集2019/11/01 04:51

nodeで書いたスクリプトが有り、中でMySQLデータベースにINSERTする処理が書かれています。
これをnode スクリプト.jsと、直接呼ぶと正常に処理が完了します。

しかし、expressでAPIを書き、その中でexecSyncを使って上記スクリプトを実行すると
処理自体は完了するのですがMysql側でshow processlistとすると、プロセスがsleep状態で残ったままとなってしまいます。

1回APIを呼ぶ度に1つプロセスが増え、expressを停止すると一斉に消えます。
expressがコネクションをプールしている?と推察しているのですがそのような設定は見当たりませんでした。

ちなみにスクリプト内ではmysql2/promiseを利用し、await con.query(~~という形で同期的に処理をしています。

どなたか、心当たりのある方はいらっしゃらないでしょうか。
よろしくお願い致します。

※追記
MySQLのエラーログには一切ログが追記されていませんでした。

※さらに追記
dodox86さんのアドバイスにより私自身の問題はクリア出来ましたが
質問内容そのものに関しては謎のままなのでこのまま残したいと思います。
引き続きexpress,Node.jsまわりでの解決の糸口をお持ちの方、ご回答のほどよろしくお願い申し上げます。

set0gut1👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2019/10/31 01:28

Linux上でおそらく運用されていることと思いますが、psコマンドでそのプロセスの状態を見ると、どのようになっていますでしょうか。
shiro09

2019/10/31 02:00

まず環境としてDockerHubにあるオフィシャルのMySQL8(Debian)を利用したDocker環境となります。 以下psコマンドの結果です。 ``` # ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND mysql 1 0.1 9.3 1638540 192016 ? Ssl 10月29 3:12 mysqld root 432 0.0 0.1 19344 3652 pts/0 Ss 10:43 0:00 bash root 486 0.0 0.1 37784 3252 pts/0 R+ 10:56 0:00 ps aux ``` psコマンドでMySQLのプロセスを見る事は可能なのでしょうか? やり方が間違っていればご指摘願います。
dodox86

2019/10/31 02:20

ご提示のps auxの実行結果は、「DBにプロセスが残っている」問題が起きているときのものでしょうか。(そうであればOKです) node.jsに限った話ではなく、Linuxで子プロセスを起動するとき、子プロセスが終了した後に親プロセスが適切に処理をしないと、ゾンビ(ZOMBIE)プロセスとして残ってしまう場合があります。psコマンドとして実行したとき、プロセスの状態として"Z"とか、"<defunct>"で確認できます。そんなケースかな、と思い、確認させてもらった次第です。 stackoverflowの関連する話題: ttps://stackoverflow.com/questions/27381163/spawning-node-js-child-processes-results-in-zombie-processes-on-cloud-foundry Dockerをお使いということで、事情はもう少し複雑かもしれません。
shiro09

2019/10/31 03:37

はい、プロセスが(今も)残っている状態での結果です。 となると仰る状況での障害では無いという切り分けが出来たという事ですね。 アドバイス頂きありがとうございます。
dodox86

2019/10/31 08:13

不勉強で知りませんでしたが、mysqlでのshow processlist で得られたプロセス状態の"sleep"とは、DBコネクションに関わるスレッド群のsleepを示しているようですね。 https://code-examples.net/ja/q/ba11c1 (機械翻訳によるものっぽくて読みづらいですが) 先のコメントで私が疑っていた、Linuxのプロセスを指すものではなさそうです。 > 1回APIを呼ぶ度に1つプロセスが増え、expressを停止すると一斉に消えます。 上記記事を読むと、スレッドは一定時間で消滅するようにも思え、また、タイムアウト値指定でその指定の時間で消滅するようにも受けとめられます。 SET GLOBAL interactive_timeout = 180; SET GLOBAL wait_timeout = 180; お試しになってみてはいかがでしょうか。
dodox86

2019/10/31 08:23 編集

また、先にお試しいただいた"ps aux"コマンドですが、mysqlがlinuxのthreadを起動しているのであればオプションは"aux"では足りなく、"H"や"-L"オプションのスレッド用の表示オプションの追加が必要となるはずです。mysqlのshow processlist でプロセスが残っている状態で、"H"や "-L"などを追加すると、表示が変わるかもしれません。
shiro09

2019/11/01 04:47

wait timeoutを少なめにする事で運用上の問題はクリア出来ました。 デフォルトが8時間もあるのが不思議なのですがその辺りは自分で勉強していきたいと思います。 dodox86さんありがとうございました。
dodox86

2019/11/01 05:26 編集

[質問中に追記されていたので、当コメントを削除]
guest

回答1

0

ベストアンサー

質問内容そのものに関しては謎のままなのでこのまま残したいと思います。

質問者さんの疑念が晴れていないようなので、質問への私のコメントのまとめ(?)の意味で回答します。

1回APIを呼ぶ度に1つプロセスが増え、expressを停止すると一斉に消えます。

execAsyncを呼ぶと生存期間の長いmysqlのプロセス(=Linuxのスレッド)が起動します。そのプロセスはmysqlのコネクションを担当するもので、mysqlの既定の設定により、生存期間が長いです。execAsync 中での処理が終わると、そのプロセスは、mysqlのshow processlistコマンドでレポートされるところの"sleep"状態になります。指定のタイムアウト時間になると消滅するはずですが、プロセスがその状態で更にexecAsyncを呼ぶと、見た目でプロセスが更に増えていく、というかたちになっているはずです。設定でそのタイムアウト値を短くするとプロセスが消えるタイミングが早まる為に、見た目でプロセス数が減る機会が増えます。

それとも、mysqlのタイムアウト設定を短くしても show processlistで報告される数は変わっていない、ということでしょうか。そうであれば、質問者さんが疑念を持たれているように、根本的な問題解決には至っていないです。

なお、expressを停止すると一斉に消えるのは、execAsyncを実行した親プロセスが終了するからだと推察します。

投稿2019/11/01 05:52

編集2019/11/01 05:55
dodox86

総合スコア9254

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shiro09

2019/11/01 15:10

> execAsyncを呼ぶと生存期間の長いmysqlのプロセス(=Linuxのスレッド)が起動します。 これで謎が解けました。シンプルにnodeコマンドで実行した時とは異なる挙動となるのですね。 大変助かりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問