使用 InfluxDB 提高每秒写作点数
Improve points per seconds writing with InfluxDB
我正在尝试提高 C 客户端程序与 InfluxDB 的单个节点之间的写入性能。
目前我的记录是每秒 2.526K 次写入,如下面的屏幕截图所示:
我的 C 程序基本上是一个无限循环,使用 libcurl.
生成 HTTP POST 请求
这是负责 POST 请求的代码:
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);
}
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);
}
- 我不使用线程(到目前为止)
- 我使用简单的API(到目前为止)
- 我更改了一些配置设置(但它们并没有提高性能):
access-log-path : "/dev/null"
pprof-enabled : false
unix-socket-enabled : false
[ifql] enabled : false
[subscriber] enabled : false
你有什么提高性能的想法吗?
编辑:如您所见,第一个屏幕截图与上面的 C 代码不对应。这是正确的:
尝试 post 以每 post 1000-10000 个点为一组的批处理数据。
批量大小必须足够大才能引起注意。您必须通过试验才能找到最佳方案。
并且最好为每一行设置明确且不同的时间戳,否则 influxdb 会将所有行视为具有相同的时间戳。在您的情况下,具有相同时间戳的多个点实际上将被视为一个数据点并相互覆盖 - 只有一个点将保留在数据库中。
我正在尝试提高 C 客户端程序与 InfluxDB 的单个节点之间的写入性能。
目前我的记录是每秒 2.526K 次写入,如下面的屏幕截图所示:
我的 C 程序基本上是一个无限循环,使用 libcurl.
生成 HTTP POST 请求这是负责 POST 请求的代码:
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);
}
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);
}
- 我不使用线程(到目前为止)
- 我使用简单的API(到目前为止)
- 我更改了一些配置设置(但它们并没有提高性能):
access-log-path : "/dev/null"
pprof-enabled : false
unix-socket-enabled : false
[ifql] enabled : false
[subscriber] enabled : false
你有什么提高性能的想法吗?
编辑:如您所见,第一个屏幕截图与上面的 C 代码不对应。这是正确的:
尝试 post 以每 post 1000-10000 个点为一组的批处理数据。 批量大小必须足够大才能引起注意。您必须通过试验才能找到最佳方案。
并且最好为每一行设置明确且不同的时间戳,否则 influxdb 会将所有行视为具有相同的时间戳。在您的情况下,具有相同时间戳的多个点实际上将被视为一个数据点并相互覆盖 - 只有一个点将保留在数据库中。