C 使用XDB提高每秒写入点数

C 使用XDB提高每秒写入点数,c,newline,libcurl,influxdb,batching,C,Newline,Libcurl,Influxdb,Batching,我正在努力提高C客户机程序和的单个节点之间的编写性能 目前我的记录是每秒2.526K次写入,如下面的屏幕截图所示: 我的C程序基本上是一个无限循环,通过使用生成HTTP POST请求 以下是负责POST请求的代码: int配置\u curl\u easy\u操作curl*curl\u easy\u处理程序 { //使用此文档页面https://curl.haxx.se/libcurl/c/curl_easy_setopt.html //行为选项 curl\u easy\u setoptcurl\

我正在努力提高C客户机程序和的单个节点之间的编写性能

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

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

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

int配置\u curl\u easy\u操作curl*curl\u easy\u处理程序 { //使用此文档页面https://curl.haxx.se/libcurl/c/curl_easy_setopt.html //行为选项 curl\u easy\u setoptcurl\u easy\u处理程序,curl\u VERBOSE,1L; //回调选项 //错误选项 //网络选项 //curl\u easy\u setoptcurl\u easy\u处理程序,CURLOPT\u URL,http://localhost:8086/ping;一个古老的测试 curl\u easy\u setoptcurl\u easy\u处理程序,CURLOPT\u URL,http://localhost:8086/write?db=XXX_metrics; curl\u easy\u setoptcurl\u easy\u处理程序,curl\u HTTP\u内容解码,0L; curl\u easy\u setoptcurl\u easy\u处理程序,curl\u传输\u编码,0L; //curl\u easy\u setoptcurl\u easy\u处理程序,CURLOPT\u HTTPHEADER,//在这里工作 curl_easy_setoptcurl_easy_处理程序,CURLOPT_协议,CURLPROTO_HTTP; curl_easy_setoptcurl_easy_处理器,CURLOPT_POST,1L; curl\u easy\u setoptcurl\u easy\u处理程序,curl\u REDIR\u协议,0L; curl_easy_setoptcurl_easy_处理程序,CURLOPT_默认_协议,http; curl\u easy\u setoptcurl\u easy\u处理程序,curl\u FOLLOWLOCATION,0L; //curl_easy_setoptcurl_easy_处理程序,CURLOPT_HTTPHEADER,NULL; //名称和密码选项 //HTTP选项 //curl\u easy\u setoptcurl\u easy\u处理程序,CURLOPT\u HTTPGET,0L; //SMTP选项 //TFTP选项 //FTP选项 //RTSP选项 //协议选项 如果curl\u easy\u setoptcurl\u easy\u处理程序,CURLOPT\u POSTFIELDS,度量值0=0,value1=872323,value2=928323,value3=238233,value4=3982332,value5=209233,value6=8732632,value7=4342421,value8=091092744,value9=230944\n度量值10=0,value11=872323,value12=928323,value13=238233,value14=3982332,value15=209,value16=8732632,value17=109422744,值19=230944!=卷发正常 返回1; //curl_easy_setoptcurl_easy_handler,CURLOPT_MIMEPOST,mime; //连接选项 //SSL和安全选项 //SSH选项 //其他选择 //TELNET选项 返回0; } int do_thingst_context_handlers*ctxts_handlers { 当你跑步的时候 { 如果配置\u curl\u easy\u操作CTXTS\u处理程序->curl.curl\u easy\u处理程序!=0 { fprintfstderr,在执行卷曲操作之前发生错误后停止运行\n; g_运行=0; 持续 } 如果curl\u easy\u performCxts\u handlers->curl.curl\u easy\u handler!=CURLE\u确定 fprintfstderr,发生错误\n; } 返回0; } 到目前为止,我还没有使用线程 到目前为止,我使用的是easyapi 我更改了一些配置设置,但没有提高性能: 您是否有一些提高绩效的想法

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


尝试在每篇文章中批量发布1000-10000点的数据。 批量大小必须足够大,才能引起注意。你必须进行试验,以找到最佳方案


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

看起来您根本不使用数据点的批处理:一个点-1个http post。试着在每篇文章中以1000-10000分的数量发布数据。你能给我一个简单的例子吗?我原以为\n字符将批处理两个点,并使我的性能成倍增加,与线路协议有关,但可能我遗漏了一些内容…对不起-没有注意到\n。但批量大小必须足够大,才能引起注意。你必须进行试验,以找到最佳方案。第一条记录中有value0-value9字段,第二条记录中有value10-value19字段,这看起来也很奇怪。通常,所有数据点的字段名称都相同。这是有意的吗?最好为每一行添加明确的不同的时间戳,否则会有变化。XDB会将所有行视为具有相同的时间戳。谢谢你的回答,我会尝试使用更多的数据点,只要复制/超过第一个数据点就行了?。是的,这是我对批处理的理解上的一个错误,现在我比我写这段代码时有了更好的理解。我不明白,如果我想使用服务器的时间戳,为什么我必须明确列出每个点的时间戳?实际上,我正在使用一些匿名数据对influxdb进行基准测试,生产数据看起来很接近,但并不完全相同,我还不知道它们是否有时间戳,因此我认为服务器提供的时间戳很好。关于时间戳:您的数据中没有使用任何标记。因此,XDB将所有数据点视为一次序列和
具有相同时间戳的多个点实际上将被视为一个数据点,并相互覆盖-db中只保留一个点。另外,不要忘记influx默认情况下需要纳秒ts精度。回顾XDB的主要概念以更好地理解它。它工作得很好,现在我有115k点/秒,每个http请求有1k批处理
access-log-path : "/dev/null" 
pprof-enabled : false 
unix-socket-enabled : false 
[ifql] enabled : false 
[subscriber] enabled : false