diff --git a/backend/internal/config/config.go b/backend/internal/config/config.go index c515b1b616..ee1004a587 100644 --- a/backend/internal/config/config.go +++ b/backend/internal/config/config.go @@ -1276,9 +1276,11 @@ type GatewayOpenAIWSConfig struct { MaxIdlePerAccount int `mapstructure:"max_idle_per_account"` // DynamicMaxConnsByAccountConcurrencyEnabled: 是否按账号并发动态计算连接池上限 DynamicMaxConnsByAccountConcurrencyEnabled bool `mapstructure:"dynamic_max_conns_by_account_concurrency_enabled"` - // OAuthMaxConnsFactor: OAuth 账号连接池系数(effective=ceil(concurrency*factor)) + // OAuthMaxConnsFactor: OAuth 账号连接池系数(effective=ceil(concurrency*factor),再受 max_conns_per_account 封顶)。 + // ctx_pool 接入下每个客户端会话在整个生命周期(含轮次之间)持有一条上游连接,此上限限制的是同时持有连接的会话数, + // 在飞请求数另由账号并发槽限制;系数 1.0 会让存活会话数一到并发数就返回 1013 busy,默认 5.0。 OAuthMaxConnsFactor float64 `mapstructure:"oauth_max_conns_factor"` - // APIKeyMaxConnsFactor: API Key 账号连接池系数(effective=ceil(concurrency*factor)) + // APIKeyMaxConnsFactor: API Key 账号连接池系数,含义与 OAuthMaxConnsFactor 相同,默认 5.0。 APIKeyMaxConnsFactor float64 `mapstructure:"apikey_max_conns_factor"` DialTimeoutSeconds int `mapstructure:"dial_timeout_seconds"` ReadTimeoutSeconds int `mapstructure:"read_timeout_seconds"` @@ -2402,8 +2404,8 @@ func setDefaults() { viper.SetDefault("gateway.openai_ws.min_idle_per_account", 4) viper.SetDefault("gateway.openai_ws.max_idle_per_account", 12) viper.SetDefault("gateway.openai_ws.dynamic_max_conns_by_account_concurrency_enabled", true) - viper.SetDefault("gateway.openai_ws.oauth_max_conns_factor", 1.0) - viper.SetDefault("gateway.openai_ws.apikey_max_conns_factor", 1.0) + viper.SetDefault("gateway.openai_ws.oauth_max_conns_factor", 5.0) + viper.SetDefault("gateway.openai_ws.apikey_max_conns_factor", 5.0) viper.SetDefault("gateway.openai_ws.dial_timeout_seconds", 10) viper.SetDefault("gateway.openai_ws.read_timeout_seconds", 900) viper.SetDefault("gateway.openai_ws.write_timeout_seconds", 120) diff --git a/backend/internal/config/config_test.go b/backend/internal/config/config_test.go index 8bf9704c63..d0ed2d6993 100644 --- a/backend/internal/config/config_test.go +++ b/backend/internal/config/config_test.go @@ -452,11 +452,11 @@ func TestLoadDefaultOpenAIWSConfig(t *testing.T) { if !cfg.Gateway.OpenAIWS.DynamicMaxConnsByAccountConcurrencyEnabled { t.Fatalf("Gateway.OpenAIWS.DynamicMaxConnsByAccountConcurrencyEnabled = false, want true") } - if cfg.Gateway.OpenAIWS.OAuthMaxConnsFactor != 1.0 { - t.Fatalf("Gateway.OpenAIWS.OAuthMaxConnsFactor = %v, want 1.0", cfg.Gateway.OpenAIWS.OAuthMaxConnsFactor) + if cfg.Gateway.OpenAIWS.OAuthMaxConnsFactor != 5.0 { + t.Fatalf("Gateway.OpenAIWS.OAuthMaxConnsFactor = %v, want 5.0", cfg.Gateway.OpenAIWS.OAuthMaxConnsFactor) } - if cfg.Gateway.OpenAIWS.APIKeyMaxConnsFactor != 1.0 { - t.Fatalf("Gateway.OpenAIWS.APIKeyMaxConnsFactor = %v, want 1.0", cfg.Gateway.OpenAIWS.APIKeyMaxConnsFactor) + if cfg.Gateway.OpenAIWS.APIKeyMaxConnsFactor != 5.0 { + t.Fatalf("Gateway.OpenAIWS.APIKeyMaxConnsFactor = %v, want 5.0", cfg.Gateway.OpenAIWS.APIKeyMaxConnsFactor) } if cfg.Gateway.OpenAIWS.StickySessionTTLSeconds != 3600 { t.Fatalf("Gateway.OpenAIWS.StickySessionTTLSeconds = %d, want 3600", cfg.Gateway.OpenAIWS.StickySessionTTLSeconds) diff --git a/deploy/config.example.yaml b/deploy/config.example.yaml index 83f3bd4bed..be9ae4f371 100644 --- a/deploy/config.example.yaml +++ b/deploy/config.example.yaml @@ -358,9 +358,13 @@ gateway: # 是否按账号并发动态计算连接池上限: # effective_max_conns = min(max_conns_per_account, ceil(account.concurrency * factor)) dynamic_max_conns_by_account_concurrency_enabled: true - # 按账号类型分别设置系数(OAuth / API Key) - oauth_max_conns_factor: 1.0 - apikey_max_conns_factor: 1.0 + # 按账号类型分别设置系数(OAuth / API Key)。 + # ctx_pool 接入下每个客户端会话在整个生命周期(轮次之间也不释放)持有一条上游连接, + # 该上限限制的是同时持有连接的会话数,在飞请求数另由账号并发限制; + # 系数 1.0 会让存活会话数一到并发数,新会话就收到 1013 upstream websocket is busy。 + # 空闲连接数另受 max_idle_per_account 裁剪。 + oauth_max_conns_factor: 5.0 + apikey_max_conns_factor: 5.0 dial_timeout_seconds: 10 read_timeout_seconds: 900 write_timeout_seconds: 120