使用InfluxDB提高每秒写入的点数

时间:2018-04-25 14:28:41

标签: c newline libcurl influxdb batching

我正在尝试提高C客户端程序与InfluxDB的单个节点之间的写入性能。

目前我的记录是每秒2.526K次写入,如下面的屏幕截图所示:

我的C程序基本上是一个无限循环,使用libcurl生成HTTP POST请求。

以下是负责POST请求的代码:

<Link href="/">Btn 1</Link>
int configure_curl_easy_operation(CURL *curl_easy_handler)
{
  // using this doc page https://curl.haxx.se/libcurl/c/curl_easy_setopt.html
  // behavior options
  curl_easy_setopt(curl_easy_handler, CURLOPT_VERBOSE, 1L);

  // callback options

  // error options

  // network options
  //curl_easy_setopt(curl_easy_handler, CURLOPT_URL, "http://localhost:8086/ping"); an old test
  curl_easy_setopt(curl_easy_handler, CURLOPT_URL, "http://localhost:8086/write?db=XXX_metrics");
  curl_easy_setopt(curl_easy_handler, CURLOPT_HTTP_CONTENT_DECODING, 0L);
  curl_easy_setopt(curl_easy_handler, CURLOPT_TRANSFER_ENCODING, 0L);
  //curl_easy_setopt(curl_easy_handler, CURLOPT_HTTPHEADER, )// work here
  curl_easy_setopt(curl_easy_handler, CURLOPT_PROTOCOLS, CURLPROTO_HTTP);
  curl_easy_setopt(curl_easy_handler, CURLOPT_POST, 1L);
  curl_easy_setopt(curl_easy_handler, CURLOPT_REDIR_PROTOCOLS, 0L);
  curl_easy_setopt(curl_easy_handler, CURLOPT_DEFAULT_PROTOCOL, "http");
  curl_easy_setopt(curl_easy_handler, CURLOPT_FOLLOWLOCATION, 0L);
  //curl_easy_setopt(curl_easy_handler, CURLOPT_HTTPHEADER, NULL);

  // NAMES and PASSWORDS OPTIONS

  // HTTP OPTIONS
  // curl_easy_setopt(curl_easy_handler, CURLOPT_HTTPGET, 0L);

  // SMTP OPTIONS

  // TFTP OPTIONS

  // FTP OPTIONS

  // RTSP OPTIONS

  // PROTOCOL OPTIONS

  if (curl_easy_setopt(curl_easy_handler, CURLOPT_POSTFIELDS, "metrics value0=0,value1=872323,value2=928323,value3=238233,value4=3982332,value5=209233,value6=8732632,value7=4342421,value8=091092744,value9=230944\nmetrics value10=0,value11=872323,value12=928323,value13=238233,value14=3982332,value15=209233,value16=8732632,value17=4342421,value18=091092744,value19=230944") != CURLE_OK)
    return (1);
  //curl_easy_setopt(curl_easy_handler, CURLOPT_MIMEPOST, mime);

  // CONNECTION OPTIONS

  // SSL and SECURITY OPTIONS

  // SSH OPTIONS

  // OTHER OPTIONS

  // TELNET OPTIONS
  return (0);
}
  1. 我不使用线程(到目前为止)
  2. 我使用easy API(到目前为止)
  3. 我更改了一些配置设置(但它们没有提高性能):
  4. int do_things(t_contexts_handlers *ctxts_handlers)
    {
      while (g_running)
        {
          if ((configure_curl_easy_operation(ctxts_handlers->curl.curl_easy_handler)) != 0)
        {
          fprintf(stderr, "Stop running after an error occured before making a curl operation\n");
          g_running = 0;
          continue;
        }
          if (curl_easy_perform(ctxts_handlers->curl.curl_easy_handler) != CURLE_OK)
        fprintf(stderr, "an error occured\n");
        }
      return (0);
    }
    

    您是否有一些提高绩效的想法?

    编辑:如您所见,第一个屏幕截图不是与上面的C代码对应的屏幕截图。这是正确的:

1 个答案:

答案 0 :(得分:1)

尝试每个帖子分批发布1000-10000个点的数据。 批量大小必须足够大才能变得明显。你必须进行试验才能找到最佳效果。

最好为每一行添加显式和不同的时间戳,否则Influxdb会将所有行视为具有相同的时间戳。在您的情况下,具有相同时间戳的多个点实际上将被视为一个数据点并相互覆盖 - 只有一个点将保留在db中。