web-dev-qa-db-ja.com

1つのポートのみを使用する20のmysqldプロセス?

これらはAliyun Cloud DBサーバーからのもので、1つの3306ポートを使用する20のmysqldプロセス

enter image description here

enter image description here

enter image description here

  • 誰かこれを見たことがある?
  • 誰かがその方法を説明できますか?
  • これには利点がありますか?
1
LawrenceLi

OSに表示されるすべてのプロセスは、mysqldから発生するすべてのカーネルスレッドです。

最初の写真を注意深く見てください

  • LinuxプロセスID _26101_はmysqld_safeです
  • LinuxプロセスID _26307_はスレッドmysqld_safeがmysqldを起動します
  • LinuxプロセスID _26308_は実際にはmysqldです
  • 19 LinuxプロセスID _26309_-_26334_はmysqld(_26308_)からのスレッドです

私の推測では、これらは単なるDB接続ですが、他の内部スレッドも可能です。

これを裏付ける場合は、次のコマンドを実行できます。

  • Mysqlでは、SELECT COUNT(1) FROM information_schema.processlist;
  • OSで_netstat | grep -c 3306_または_netstat | grep mysql | grep -c ESTABLISHED_を実行します
  • 結果はOSに有利な場合があります

Mysqldの古いバージョンは、OSでこれを行う傾向があります。例として、以下を見てください。

Mysqldがこの動作をする場合、おそらくソースコンパイルによってビルドされたが、適切なコンパイルオプションなしでビルドされたのではないかといつも思っていました。 mysqldは、OSの目に複数の接続としてこれを明示します。

結論

あなたは本当に心配することは何もありません。 mysqldは引き続き正しく機能します。 mysqldバイナリが作成された環境と、それらのバイナリが実行されている場所がすべてです。

0
RolandoMySQLDBA

私たちが見ることは不可能なので、論理的な仮定はそれが幻想であるということです。

複数のMySQLサーバーインスタンスが同じポートをリッスンすることはできません。また、同じように同じpidファイルを共有することも、InnoDBのデータファイルを共有することもできません。

これの最も賢明な説明は、ツールがプロセスではなくスレッドを表示しているということです-なんらかの理由で。 Linuxのスレッド(これがそうである場合)は同じプロセスIDを共有しますが、PIDと同じ番号付けスペースに由来する独自のスレッドIDも持っています。

最も説得力があるのは、私が思うに、20以上のエントリがあり、それぞれが使用可能なメモリの10.9%を消費していることです。 MySQLサーバーが同じ量のメモリー(特にビジーなメモリー)を保持する場合、複数の同一インスタンスではほとんどありませんが、このサーバーでのメモリー使用量が200%を超えることは不可能です。

_mysql> SHOW FULL PROCESSLIST;_をSUPERまたはPROCESS特権を持つユーザーが実行すると、アクティブなクライアントスレッドが表示され、ここでは特にビジーであるように見える2つのエントリを表すエントリが含まれる可能性があります。もちろん、すべてのスレッドがクライアントスレッドであるとは限らないため、出力はここに示されているよりも少なくなります。

接続と切断を繰り返し、SELECT CONNECTION_ID(), UUID_SHORT();を発行するか、同時に複数の接続でこれを実行することで、実行中のインスタンスが実際には1つしかないことを確認してください。どちらの値もほぼ単調に増加し(connection_idは接続ごとに増加しますが、接続中は同じまま、uuid_shortはクエリごとに増加します)、決して小さくなることはありません。複数のMySQLサーバーデーモンインスタンスが関係している場合、これは事実上不可能です。

0

それらはすべて同じポートを使用しているわけではありません。

メインのmysqldプロセスはその子をforkedします(ps出力の2番目と3番目の列で子<>親関係を確認できます-pid 26308はマスター "スレッド"。TCPポートで実際にリッスンしているプロセスは1つだけです。これはlsofを使用して確認できます。forkedプロセスを追加します_argv[]_がfork()呼び出しの前に明示的に変更されていない限り、その親からコマンドラインを継承します。したがって、_--port=3306_との混乱-何も意味しません。

0
Philᵀᴹ

オペレーティングシステムによっては、mysqldのプロセスが1つ表示される場合と、接続ごとに1つ表示される場合があります。各初期ポート3306に接続されています。

(クライアントで)接続プールがある場合や、thread_cache_sizeの値が高く、wait_timeoutの値が高い場合は、「消えない」アイドル接続がたくさんある可能性があります。

ローランドが言うように、「心配することは何もない」。

一方、39.6% CPUは非常に高いです。 SHOW FULL PROCESSLIST;を実行して、キャッチできるかどうかを確認してください。次に、そのビジーなクエリを改善することを検討してください。 (これは「気になる」ことかもしれないし、そうでないかもしれません。)

0
Rick James