Python を使用して大量のデータを処理し、MySQL で処理ステータスを維持しようとしています。しかし、python-mysql (Java の HikariCP のような) の標準接続プールがないことに驚いています。
私は最初に PyMySQL から始めました。プログラムが最初の数時間実行されるまで、物事は素晴らしかったです。数時間後、物事は失敗し始めました。次のような多くのエラーが発生していました。
pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' ([Errno 99] Cannot assign requested address)")
さらに、接続プールがないために頻繁に接続を開いたり閉じたりしているため、多くのポートが TIME_WAIT 状態でスタックしていました。
/d/p/950 ❯❯❯ netstat -nt | wc -l
84752
thisとthisに従って、 tcp_fin_timeoutと ip_local_port_range を設定しようとしましたが、ほとんど何も改善されませんでした。
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
echo 15000 65000 > /proc/sys/net/ipv4/ip_local_port_range
その後、MySQL がプーリング機能を備えた mysql.connector を提供していることを知りました。そのすべてを実行した後、パフォーマンスは実際に低下しました。より多くのプロセスが失敗し始めました。私はPythonのマルチプロセッシングモジュールを使用して、24コアのマシンで29個のプロセスを同時に実行しています(マルチプロセッシング.プールはデフォルトでこれを選択しませんでした)。以下はコードです。もちろん、 .my.cnf を使用してすべての資格情報を渡し、 git へのコミットを回避していました。
import mysql.connector
from mysql.connector import pooling
conn_pool = pooling.MySQLConnectionPool(pool_name="mypool1",
pool_size=pooling.CNX_POOL_MAXSIZE,
option_files=MYSQL_CONFIG,
option_groups=MYSQL_GROUP_NODE1,
allow_local_infile=True)
conn = conn_pool.get_connection()
最後に、古いコードに戻しました。まだ PyMySQL を使用しており、エラーはそれほど頻繁ではありませんが、依然として大きな問題を引き起こしています。私は SQLAlchemy を調べましたが、プーリングに関するドキュメントはあまり見つかりませんでした。
mysql-python 接続プーリングの問題を他の人はどのように扱っているのでしょうか? 車輪を再発明する必要がないように、そこには何かがあるべきだと本当に信じています.
どんなポインタでも大歓迎です。