我正在尝试提高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代码相对应的屏幕截图。这是正确的:
最佳答案
尝试以每篇文章1000-10000点为单位分批发布数据。
批次大小必须足够大才能引起注意。您必须尝试找到最佳选择。
并且最好为每行放置显式且不同的时间戳,否则influxdb会将所有行视为具有相同的时间戳。在您的情况下,具有相同时间戳的多个点实际上将被视为一个数据点并相互覆盖-数据库中仅保留一个点。
关于c - 使用InfluxDB提高每秒写入点数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50024857/