コンテンツにスキップ

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が返却されるまで待機します。

フィードバック

このページは役に立ちましたか?