diff --git a/internal/config/defaults.go b/internal/config/defaults.go index 6a9a971..290b29f 100644 --- a/internal/config/defaults.go +++ b/internal/config/defaults.go @@ -69,6 +69,8 @@ func DefaultConfig() *Config { CodeCacheSize: 1000, EnableFileWatch: true, MaxExecutionTime: 30 * time.Second, + LStatePoolInitialSize: 100, + LStatePoolMaxSize: 1000, }, }, Static: []StaticConfig{{ @@ -335,6 +337,8 @@ func GenerateConfigYAML(cfg *Config) ([]byte, error) { fmt.Fprintf(&buf, " # coroutine_stack_size: %d # 协程栈大小(0=使用默认值)\n", cfg.Servers[0].Lua.GlobalSettings.CoroutineStackSize) fmt.Fprintf(&buf, " # coroutine_pool_warmup: %d # 协程池预热数量(0=不预热)\n", cfg.Servers[0].Lua.GlobalSettings.CoroutinePoolWarmup) fmt.Fprintf(&buf, " # minimize_stack_memory: %v # 最小化栈内存使用\n", cfg.Servers[0].Lua.GlobalSettings.MinimizeStackMemory) + fmt.Fprintf(&buf, " # lstate_pool_initial_size: %d # LState池初始大小\n", cfg.Servers[0].Lua.GlobalSettings.LStatePoolInitialSize) + fmt.Fprintf(&buf, " # lstate_pool_max_size: %d # LState池最大大小\n", cfg.Servers[0].Lua.GlobalSettings.LStatePoolMaxSize) buf.WriteString("\n") // static 配置 diff --git a/internal/config/variable_config.go b/internal/config/variable_config.go index 1f069b9..9ad614d 100644 --- a/internal/config/variable_config.go +++ b/internal/config/variable_config.go @@ -208,4 +208,10 @@ type LuaGlobalSettings struct { // MinimizeStackMemory 启用栈内存自动收缩以减少内存占用 MinimizeStackMemory bool `yaml:"minimize_stack_memory"` + + // LStatePoolInitialSize LState 池初始大小(预热数量) + LStatePoolInitialSize int `yaml:"lstate_pool_initial_size"` + + // LStatePoolMaxSize LState 池最大大小(与 MaxConcurrentCoroutines 匹配) + LStatePoolMaxSize int `yaml:"lstate_pool_max_size"` } diff --git a/internal/lua/config.go b/internal/lua/config.go index a6bbca0..5ab60a5 100644 --- a/internal/lua/config.go +++ b/internal/lua/config.go @@ -87,8 +87,8 @@ func DefaultConfig() *Config { EnableLoadLib: false, CoroutineStackSize: 64, // 优化:较小的栈减少内存分配 MinimizeStackMemory: true, - CoroutinePoolWarmup: 4, // 预热4个协程结构 - LStatePoolInitialSize: 10, // LState 池预热 10 个 - LStatePoolMaxSize: 100, // LState 池最大 100 个 + CoroutinePoolWarmup: 4, // 预热4个协程结构 + LStatePoolInitialSize: 100, // LState 池预热 100 个 + LStatePoolMaxSize: 1000, // LState 池最大 1000 个(与 MaxConcurrentCoroutines 匹配) } } diff --git a/internal/lua/middleware.go b/internal/lua/middleware.go index 977242e..5add98d 100644 --- a/internal/lua/middleware.go +++ b/internal/lua/middleware.go @@ -169,10 +169,9 @@ func (m *LuaMiddleware) Process(next fasthttp.RequestHandler) fasthttp.RequestHa // 初始化协程 if err := luaCtx.InitCoroutine(); err != nil { - // 协程创建失败,记录错误并继续 + // 协程创建失败,返回 500 错误,不继续执行后续处理器 ctx.Error(fmt.Sprintf("lua coroutine init failed: %v", err), fasthttp.StatusInternalServerError) luaCtx.Release() - next(ctx) return } diff --git a/internal/server/init.go b/internal/server/init.go index 854aab9..7ef7c7b 100644 --- a/internal/server/init.go +++ b/internal/server/init.go @@ -111,6 +111,8 @@ func initLuaEngine(luaCfg *config.LuaMiddlewareConfig) (*lua.LuaEngine, error) { EnableOSLib: false, // 安全默认值 EnableIOLib: false, EnableLoadLib: false, + LStatePoolInitialSize: luaCfg.GlobalSettings.LStatePoolInitialSize, + LStatePoolMaxSize: luaCfg.GlobalSettings.LStatePoolMaxSize, } // 设置协程栈优化选项 @@ -138,6 +140,12 @@ func initLuaEngine(luaCfg *config.LuaMiddlewareConfig) (*lua.LuaEngine, error) { } if engineCfg.MaxExecutionTime == 0 { engineCfg.MaxExecutionTime = 30 * time.Second + } + if engineCfg.LStatePoolInitialSize == 0 { + engineCfg.LStatePoolInitialSize = 100 + } + if engineCfg.LStatePoolMaxSize == 0 { + engineCfg.LStatePoolMaxSize = 1000 } engine, err := lua.NewEngine(engineCfg)