3

Lua コードからの HTTP リクエストを処理する必要がある HTTP サーバーがあります。C コードから、この方法で Lua C API を呼び出します (アイデアはhereから来ています)。

lua_State *L = luaL_newstate();
luaL_openlibs(L);
luaL_loadfile(L, "some.lua");
lua_pcall(L, 0, 0, 0);   /* preload */
lua_getglobal(L, "handle");
lua_pushstring(L, "http_request");
lua_pcall(L, 1, 1, 0);
lua_close(L);

この一連のコードは、HTTP リクエストごとに実行されます。マルチスレッドワーカーのコンテキストでは、このコードにはかなりのパフォーマンス コストがかかります (20000tps から 100tps)。C から Lua コードを呼び出すより効率的な方法があったのだろうか?


アップデート

これらすべての Lua C API 呼び出しをコメント アウトすると、20000tps を作成できます。しかし、このAPI呼び出しを開くと、100tps. some.luaにいくつかの変更を加えると(呼び出しを削除しrequire、空の Lua ファイルのみをロードします)、パフォーマンスは約 15000tps になります。

少なくとも、これらの API 呼び出しのコストは約 5000tps ですが、この API 呼び出しをより高速にするにはどうすればよいでしょうか?

4

1 に答える 1

2

Lua の状態ごとにスレッドセーフなキューを使用し、無限ループで状態をキューからポップします。キューが空の場合、キューへの挿入時にトリガーされる条件で状態を待機させます。生のスレッド API 呼び出しを最適化して C に近い速度に近づけるため、LuaJIT をお勧めします。

大量の HTTP リクエストを処理していない限り、(設計で言及されているように) これは大きなメリットにはなりません。

注: このアプローチには、複数のリクエストに対する Lua の状態の再利用が含まれます。これがセキュリティ上の問題である場合、セッションごとの Lua 状態で有効期限切れのタイムアウトを使用して何かを実行できる可能性があります...しかし、私にはわかりません。(これは、ステートフルなサーバーとクライアントのパートナーシップにおける興味深い実験になるでしょう! Lua 状態を使用してユーザーのセッション全体を保持し、新しい要求があるときにスリープから再開することができます...これは高速です。)

于 2013-06-22T06:31:16.547 に答える