0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Tomcat コネクションプール超過テスト

Posted at

1.目的

・tomcatプールテスト

2.pythonプログラム

import requests
from concurrent.futures import ThreadPoolExecutor, as_completed
import argparse
import socket

# Tomcatの接続プール数を設定できるように引数を追加
def parse_arguments():
    parser = argparse.ArgumentParser(description='Tomcatのプールを使い切る負荷テストプログラム')
    parser.add_argument('url', type=str, help='TomcatサーバーのURL')
    parser.add_argument('--connections', type=int, default=10, help='同時接続するプール数(デフォルト: 10)')
    return parser.parse_args()

# リクエストを送信し、ステータスを返す関数
def send_request(session, url):
    try:
        response = session.get(url)
        return response.status_code
    except Exception as e:
        return str(e)

# サーバーのポート番号を取得する関数
def get_port_from_url(url):
    try:
        # URLからポート番号を取得
        host = url.split('//')[1].split('/')[0]
        port = int(host.split(':')[1]) if ':' in host else 80
        return port
    except Exception:
        return None

# 使用中のプール数を表示する関数(仮想的にプール数を管理する)
class PoolManager:
    def __init__(self):
        self.active_connections = 0

    def increment(self):
        self.active_connections += 1

    def decrement(self):
        self.active_connections = max(0, self.active_connections - 1)

    def get_active_connections(self):
        return self.active_connections

# メインの実行部分
def main():
    args = parse_arguments()
    url = args.url
    max_connections = args.connections

    # プール管理クラスをインスタンス化
    pool_manager = PoolManager()

    # 使用するポート番号を取得して表示
    port = get_port_from_url(url)
    if port:
        print(f"接続先のポート番号: {port}")
    else:
        print("ポート番号の取得に失敗しました。デフォルトのポートを使用する可能性があります。")

    print(f"指定された接続プール数: {max_connections}")

    with ThreadPoolExecutor(max_workers=max_connections) as executor:
        with requests.Session() as session:
            futures = [executor.submit(send_request, session, url) for _ in range(max_connections)]

            for future in as_completed(futures):
                pool_manager.increment()  # 新しい接続をカウント

                try:
                    status = future.result()
                    print(f'リクエスト成功: ステータスコード {status}、使用中プール数: {pool_manager.get_active_connections()}')
                except Exception as e:
                    print(f'リクエストエラー: {e}、使用中プール数: {pool_manager.get_active_connections()}')

                pool_manager.decrement()  # 処理完了で接続を減らす

if __name__ == '__main__':
    main()

3.実行方法

python tomcat_pool_test.py http://your-tomcat-server:8080/your-app-endpoint --connections 100

注意点
引数で --connections の値を指定せずに実行した場合、デフォルトで10の接続数になります。
TARGET_URL は実際に接続を行いたいTomcatサーバーのエンドポイントに置き換えてください。
負荷テストやリソース枯渇を意図しているため、実行は必ずテスト環境で行い、本番環境では実行しないように注意してください。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?