关于全局配置

全局配置用于配置全局默认参数,以适应的实际业务需求,提升程序性能。 全局配置的修改必须在使用框架任何调用之前,否则修改可能无法生效。 另外,一些全局配置选项,可以被upstream配置覆盖。这部分请参考upstream相关文档。

修改默认配置

WFGlobal.h里,包含了全局配置的结构体与默认值:

  1. struct WFGlobalSettings
  2. {
  3. struct EndpointParams endpoint_params;
  4. unsigned int dns_ttl_default; ///< in seconds, DNS TTL when network request success
  5. unsigned int dns_ttl_min; ///< in seconds, DNS TTL when network request fail
  6. int dns_threads;
  7. int poller_threads;
  8. int handler_threads;
  9. int compute_threads; ///< auto-set by system CPU number if value<=0
  10. };
  11. static constexpr struct WFGlobalSettings GLOBAL_SETTINGS_DEFAULT =
  12. {
  13. .endpoint_params = ENDPOINT_PARAMS_DEFAULT,
  14. .dns_ttl_default = 12 * 3600,
  15. .dns_ttl_min = 180,
  16. .dns_threads = 4,
  17. .poller_threads = 4,
  18. .handler_threads = 20,
  19. .compute_threads = -1,
  20. };

其中EndpointParams结构体和默认值在EndpointParams.h文件里:

  1. struct EndpointParams
  2. {
  3. size_t max_connections;
  4. int connect_timeout;
  5. int response_timeout;
  6. int ssl_connect_timeout;
  7. };
  8. static constexpr struct EndpointParams ENDPOINT_PARAMS_DEFAULT =
  9. {
  10. .max_connections = 200,
  11. .connect_timeout = 10 * 1000,
  12. .response_timeout = 10 * 1000,
  13. .ssl_connect_timeout = 10 * 1000,
  14. };

举个例子,把默认的连接超时改为5秒,dns默认ttl改为1小时,用于消息反序列化的poller线程增加到10个:

  1. #include "workflow/WFGlobal.h"
  2. int main()
  3. {
  4. struct WFGlobalSettings settings = GLOBAL_SETTINGS_DEFAULT;
  5. settings.endpoint_params.connect_timeout = 5 * 1000;
  6. settings.dns_ttl_default = 3600;
  7. settings.poller_threads = 10;
  8. WORKFLOW_library_init(&settings);
  9. ...
  10. }

大多数参数的意义都比较清晰。注意dns ttl相关参数,单位是。endpoint相关超时参数单位是毫秒,并且可以用-1表示无限。
dns_threads表示并行访问dns的线程数。目前我们dns是通过系统函数getaddrinfo访问的。如果对dns并发性能有需求,可增加这个值。
compute_threads表示用于计算的线程数,默认-1代表与当前节点CPU核数相同。
与网络性能相关的两个参数为poller_threads和handler_threads:

  • poller线程主要负责epoll(kqueue)和消息反序列化。
  • handler线程是网络任务callback和process所在线程。

所有框架需要的资源,都是在第一次被使用时才申请的。例如用户没有用到dns解析,那么dns线程不会被启动。