Scheck 並行処理戦略¶
- バージョン:1.0.7-7-g251eead
- リリース日:2023-04-06 11:17:57
- 対応OS:windows/amd64,windows/386,linux/arm,linux/arm64,linux/386,linux/amd64
スレッドプールとタスクキューによるluaスクリプトのスケジューリング¶
元の形式では、1つのlua protoが1つのlua.stateオブジェクトに対応していました。各stateオブジェクトは共通のライブラリと共通データを読み込みます。各lua protoは実行時に1つのタイマーに対応するため、実行時に多数のluaスクリプトが集中して実行され、すべてのstateが過剰なメモリを占有するという問題が発生していました。そこで、以下の最適化を実施しました。
- lua.stateプールを作成し、使用時にプールから取得し、使用後に回収します。
- スレッドプールのサイズは動的に設定され、複数のタスクを同時に実行する必要がある場合に、十分なstateオブジェクトを利用できるようにします。
- すべてのタイマーを廃止し、すべてをインターバル実行に変更しました。理由は、Scheckが実行するluaスクリプトに高いリアルタイム性が要求されておらず、実行時間の多少のずれが許容されるためです。
スレッドプール¶
lua.stateはlua protoを実行する最小単位であり、lua仮想マシンとも呼ばれます。スレッドプールは複数のlua.stateで構成されます。
- スレッドプールからstatesオブジェクトを取得する際、プールに残っていればプールから取得します。
- プールにない場合でも、実行中の数が最大許容実行数(cap)に達していなければ、stateオブジェクトを作成します。このstateオブジェクトは呼び出しの終了とともに回収されます。
- プール内のstateオブジェクトは使用後すぐに回収されます。
- 初期サイズと最大容量が設定されており、実行数のピークが許容されます。
タスクキュー¶
- luaの実行時間を統一し、インターバル時間で構成されたキューに変更します。
- タスクキューを走査し、現在時刻に最も近いタスクを取得します。現在時刻を過ぎている場合は、すぐに実行します。
- 現在時刻までまだ時間がある場合は、タイマーを起動し、時間になったら実行します。
- タスク実行時には、luaのprotoを実行するためのstateが必要です。そのため、スレッドプールからstateを取得する必要があります。このとき、プールになく、かつ総実行数が設定されたピーク値に達している場合は、待機状態になります。他のタスクの実行が終了し、stateが返却されるまで待機します。