InfluxDB读写性能测试

今天进行了InfluxDB和MySQL的对比测试,这里记录下结果,也方便我以后查阅。

操作系统: CentOS6.5_x64
InfluxDB版本 : v1.1.0
MySQL版本:v5.1.73
CPU : Intel(R) Core(TM) i5-2320 CPU @ 3.00GHz
内存 :12G
硬盘 :SSD

一、MySQL读写测试

测试准备

初始化SQL语句:

CREATE DATABASE testMysql;
CREATE TABLE `monitorStatus` (
    `system_name` VARCHAR(20) NOT NULL,
    `site_name` VARCHAR(50) NOT NULL,
    `equipment_name` VARCHAR(50) NOT NULL,
    `current_value` DOUBLE NOT NULL,
    `timestamp` BIGINT(20) NULL DEFAULT NULL,
    INDEX `system_name` (`system_name`),
    INDEX `site_name` (`site_name`),
    INDEX `equipment_name` (`equipment_name`),
    INDEX `timestamp` (`timestamp`)
)
ENGINE=InnoDB;

单写测试代码(insertTest1.c):

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include "mysql/mysql.h"

#define N 100

int main()
{
    MYSQL *conn_ptr;
    int res;
    int t,i,j;
    int64_t tstamp = 1486872962;
    srand(time(NULL));
    t=0;
    conn_ptr = mysql_init(NULL);
    if (!conn_ptr)
    {
        printf("mysql_init failed\n");
        return EXIT_FAILURE;
    }
    conn_ptr = mysql_real_connect(conn_ptr,"localhost","root","","testMysql",0,NULL,0);
    if (conn_ptr)
    {
        for(i=1;i<= 10000;i++)
        {
            mysql_query(conn_ptr,"begin");
            for(j=0;j<N;j++,t++)
            {
                char query[1024]={0};

                sprintf(query,"insert into monitorStatus values (‘sys_%d‘,‘s_%d‘,‘e_%d‘,‘0.%02d‘,‘%lld‘);",
                    //j%10,(t+i)%10,(t+j)%10,(t+i+j)%100,tstamp);
                    j%10,(t+i)%10,(t+j)%10,rand()%100,tstamp);
                //printf("query : %s\n",query);
                res = mysql_query(conn_ptr,query);

                if (!res)
                {
                    //printf("Inserted %lu rows\n",(unsigned long)mysql_affected_rows(conn_ptr));
                }
                else
                {
                    fprintf(stderr, "Insert error %d: %sn",mysql_errno(conn_ptr),mysql_error(conn_ptr));
                }
                if(j%10 == 0) tstamp+=1;
            }
            mysql_query(conn_ptr,"commit");
            //printf("i=%d\n",i);
        }
    }
    else
    {
        printf("Connection failed\n");
    }
    mysql_close(conn_ptr);
    return EXIT_SUCCESS;
}

可根据情况调整测试代码中的N参数。

单读测试代码(queryTest1.c):

#include <stdio.h>
#include <stdlib.h>
#include "mysql/mysql.h"

int main()
{
    MYSQL *conn_ptr;
    MYSQL_RES *res_ptr;
    MYSQL_ROW sqlrow;
    MYSQL_FIELD *fd;
    int res, i, j;  

    conn_ptr = mysql_init(NULL);
    if (!conn_ptr)
    {
        return EXIT_FAILURE;
    }
    conn_ptr = mysql_real_connect(conn_ptr,"localhost","root","","testMysql", 0, NULL, 0);
    if (conn_ptr)
    {
        res = mysql_query(conn_ptr,"select * from `monitorStatus` where system_name=‘sys_8‘ and site_name=‘s_9‘ and equipment_name=‘e_6‘ order by timestamp desc limit 10000;");

        if (res)
        {
            printf("SELECT error:%s\n",mysql_error(conn_ptr));
        }
        else
        {
            res_ptr = mysql_store_result(conn_ptr);
            if(res_ptr)
            {
                printf("%lu Rows\n",(unsigned long)mysql_num_rows(res_ptr));
                j = mysql_num_fields(res_ptr);
                while((sqlrow = mysql_fetch_row(res_ptr)))
                {
                    continue;
                    for(i = 0; i < j; i++)
                        printf("%s\t", sqlrow[i]);
                    printf("\n");
                }
                if (mysql_errno(conn_ptr))
                {
                    fprintf(stderr,"Retrive error:s\n",mysql_error(conn_ptr));
                }
            }
            mysql_free_result(res_ptr);
        }
    }
    else
    {
        printf("Connection failed\n");
    }
    mysql_close(conn_ptr);
    return EXIT_SUCCESS;
}  

Makefile文件:

all:
    gcc -g insertTest1.c -o insertTest1 -L/usr/lib64/mysql/ -lmysqlclient
    gcc -g queryTest1.c -o queryTest1 -L/usr/lib64/mysql/ -lmysqlclient

clean:
    rm -rf insertTest1
    rm -rf queryTest1    

测试数据记录

磁盘空间占用查询:

使用du方式(新数据库,仅为测试):

du -sh /var/lib/mysql

查询特定表:

use information_schema;
select concat(round(sum(DATA_LENGTH/1024/1024), 2), ‘MB‘) as data from TABLES where table_schema=‘testMysql‘ and table_name=‘monitorStatus‘;

测试结果:

  • 100万条数据

    [[email protected] mysqlTest]# time ./insertTest1
    
    real    1m20.645s
    user    0m8.238s
    sys    0m5.931s
    
    [[email protected] mysqlTest]# time ./queryTest1
    10000 Rows
    
    real    0m0.269s
    user    0m0.006s
    sys    0m0.002s

    原始数据 : 28.6M
    du方式 : 279MB
    sql查询方式: 57.59MB
    写入速度: 12398 / s
    读取速度: 37174 / s

  • 1000万条数据

    [email protected] mysqlTest]# time ./insertTest1
    
    real    7m15.003s
    user    0m48.187s
    sys    0m33.885s
    
    [[email protected] mysqlTest]# time ./queryTest1
    10000 Rows
    
    real    0m6.592s
    user    0m0.005s
    sys    0m0.002s

    原始数据 : 286M
    du方式 : 2.4G
    sql查询方式: 572MB
    写入速度: 22988 / s
    读取速度: 1516 / s

  • 3000万条数据

    [[email protected] mysqlTest]# time ./insertTest1
    
    real    20m38.235s
    user    2m21.459s
    sys    1m40.329s
    [[email protected] mysqlTest]# time ./queryTest1
    10000 Rows
    
    real    0m4.421s
    user    0m0.004s
    sys    0m0.004s

    原始数据 : 858M
    du方式 : 7.1G
    sql查询方式: 1714MB
    写入速度: 24228 / s
    读取速度: 2261 / s

二、InfluxDB读写测试

测试准备

需要将InfluxDB的源码放入 go/src/github.com/influxdata 目录

单写测试代码(write1.go):

package main

import (
    "log"
    "time"
    "fmt"
    "math/rand"
    "github.com/influxdata/influxdb/client/v2"
)

const (
    MyDB = "testInfluxdb"
    username = "root"
    password = ""
)

func queryDB(clnt client.Client, cmd string) (res []client.Result, err error) {
    q := client.Query{
        Command:  cmd,
        Database: MyDB,
    }
    if response, err := clnt.Query(q); err == nil {
        if response.Error() != nil {
            return res, response.Error()
        }
        res = response.Results
    } else {
        return res, err
    }
    return res, nil
}

func writePoints(clnt client.Client,num int) {
    sampleSize := 1 * 10000
    rand.Seed(42)
    t := num
    bp, _ := client.NewBatchPoints(client.BatchPointsConfig{
        Database:  MyDB,
        Precision: "us",
    })

    for i := 0; i < sampleSize; i++ {
        t += 1
        tags := map[string]string{
            "system_name": fmt.Sprintf("sys_%d",i%10),
            "site_name":fmt.Sprintf("s_%d", (t+i) % 10),
            "equipment_name":fmt.Sprintf("e_%d",t % 10),
        }
        fields := map[string]interface{}{
            "value" : fmt.Sprintf("%d",rand.Int()),
        }
        pt, err := client.NewPoint("monitorStatus", tags, fields,time.Now())
        if err != nil {
            log.Fatalln("Error: ", err)
        }
        bp.AddPoint(pt)
    }

    err := clnt.Write(bp)
    if err != nil {
        log.Fatal(err)
    }

    //fmt.Printf("%d task done\n",num)
}

func main() {
    // Make client
    c, err := client.NewHTTPClient(client.HTTPConfig{
        Addr: "http://localhost:8086",
        Username: username,
        Password: password,
    })

    if err != nil {
        log.Fatalln("Error: ", err)
    }
    _, err = queryDB(c, fmt.Sprintf("CREATE DATABASE %s", MyDB))
    if err != nil {
        log.Fatal(err)
    }

    i := 1
    for i <= 10000 {
        defer writePoints(c,i)
        //fmt.Printf("i=%d\n",i)
        i += 1
    }
    //fmt.Printf("task done : i=%d \n",i)

}

单读测试代码(query1.go):

package main

import (
    "log"
    //"time"
    "fmt"
    //"math/rand"
    "github.com/influxdata/influxdb/client/v2"
)

const (
    MyDB = "testInfluxdb"
    username = "root"
    password = ""
)

func queryDB(clnt client.Client, cmd string) (res []client.Result, err error) {
    q := client.Query{
        Command:  cmd,
        Database: MyDB,
    }
    if response, err := clnt.Query(q); err == nil {
        if response.Error() != nil {
            return res, response.Error()
        }
        res = response.Results
    } else {
        return res, err
    }
    return res, nil
}

func main() {
    // Make client
    c, err := client.NewHTTPClient(client.HTTPConfig{
        Addr: "http://localhost:8086",
        Username: username,
        Password: password,
    })

    if err != nil {
        log.Fatalln("Error: ", err)
    }
    q := fmt.Sprintf("select * from monitorStatus where system_name=‘sys_5‘ and site_name=‘s_1‘ and equipment_name=‘e_6‘ order by time desc limit 10000 ;")
    res, err2 := queryDB(c, q)
    if err2 != nil {
        log.Fatal(err)
    }
    count := len(res[0].Series[0].Values)
    log.Printf("Found a total of %v records\n", count)

}

测试结果记录

查看整体磁盘空间占用:

du -sh /var/lib/influxdb/

查看最终磁盘空间占用:

du -sh /var/lib/influxdb/data/testInfluxdb 
  • 100万条数据

    [[email protected] goTest2]# time ./write1
    real    0m14.594s
    user    0m11.475s
    sys    0m0.251s
    
    [[email protected] goTest2]# time ./query1
    2017/02/12 20:00:24 Found a total of 10000 records
    
    real    0m0.222s
    user    0m0.052s
    sys    0m0.009s

    原始数据 : 28.6M
    整体磁盘占用:27M
    最终磁盘占用:21M
    写入速度: 68521 / s
    读取速度: 45045 / s

  • 1000万条数据
    [[email protected] goTest2]# time ./write1
    
    real    2m22.520s
    user    1m51.704s
    sys    0m2.532s
    
    [[email protected] goTest2]# time ./query1
    2017/02/12 20:05:16 Found a total of 10000 records
    
    real    0m0.221s
    user    0m0.050s
    sys    0m0.003s

    原始数据 : 286M
    整体磁盘占用:214M
    最终磁盘占用:189M 写入速度: 70165 / s
    读取速度: 45249 / s

  • 3000万条数据

    [[email protected] goTest2]# time ./write1
    
    real    7m19.121s
    user    5m49.738s
    sys    0m8.189s
    [[email protected] goTest2]# ls
    query1  query1.go  write1  write1.go
    [[email protected] goTest2]# time ./query1
    2017/02/12 20:49:40 Found a total of 10000 records
    
    real    0m0.233s
    user    0m0.050s
    sys    0m0.012s

    原始数据 : 858M
    整体磁盘占用:623M
    最终磁盘占用:602M
    写入速度: 68318 / s
    读取速度: 42918 / s

三、测试结果分析

整体磁盘占用情况对比:

最终磁盘占用情况对比:

写入速度对比:

读取速度对比:

结论:

相比MySQL来说,InfluxDB在磁盘占用和数据读取方面很占优势,而且随着数据规模的扩大,查询速度没有明显的下降。
针对时序数据来说,InfluxDB有明显的优势。

好,就这些了,希望对你有帮助。

本文github地址:

https://github.com/mike-zhang/mikeBlogEssays/blob/master/2017/20170212_InfluxDB读写性能测试.md

欢迎补充

时间: 2024-10-01 07:36:37

InfluxDB读写性能测试的相关文章

java对比IO和NIO的文件读写性能测试

原文:java对比IO和NIO的文件读写性能测试 源代码下载地址:http://www.zuidaima.com/share/1550463508466688.htm 1. NIO采用更接近操作系统执行IO的方式:通道和缓存器:顾名思义,数据源的数据由缓存器通过通道进行传输. 2. 在JDK5之后,原始IO系统底层用NIO进行了优化,这可以通过sun公布的源码中找到,但是,NIO系统性还是比IO强. 3. 在稍微研究了IO源码以及部分sun源码,我觉得IO系统的性能瓶颈主要是由于原始的IO架构因

OpenWrt中对USB文件系统的操作, 以及读写性能测试

参考 http://h-wrt.com/en/doc/flash 1. 查看usb存储在启动日志中的信息 # dmesg [ 5.720000] usbcore: registered new interface driver usbfs [ 5.730000] usbcore: registered new interface driver hub [ 5.740000] usbcore: registered new device driver usb [ 5.740000] ehci_hc

ceph的读写性能测试

block 读写顺序 读写数据 线程数 IOPS 带宽速度 运行时间 s 4K Rados 随机读 174M 16 15563 60.7961MB/s 2 顺序读 174M 16 13199 51.5621MB/s 2 随机写 174M 16 1486 5.80794MB/s 30 4K RBD 随机读 17.6G 16 104000 587.7MB/s 30 顺序读 2.2G 16 23800 74MB/s 30 随机写 571M 16 2352 19MB/s 30 顺序写 43M 16 35

GDI+下Bitmap逐像素快速读写性能测试

写在前面的话: 本文针对GDI+下Bitmap操作(Get/SetPixel)进行测试,而非寻求最快速的位图处理方式.如果你需要速度上的提升,请使用GDI+以外的技术,如并行计算.调用MMX/SSE指令.CUDA等. 这是一个古老的技巧:使用Bitmap类时经常会用到GetPixel和SetPixel,但是这两个方法直接使用都比较慢,所以一般都会使用LockBits/UnlockBits将位图在内存中锁定,以加快操作速度.MSDN上的标准参考是这样的: MSDN示例:锁定内存后拷贝 用指针法会更

jmeter+influxdb+grafana性能测试监控

背景: 话说Jmeter原生的监控确实太丑了,听大佬们在讨论Jmeter+InfluxDb+Grafana的监控,于是,为了有一个漂亮的测试报告,就手动开始进行部署. 安装步骤: 1.influxdb下载安装: [[email protected] ~]# wget https://dl.influxdata.com/influxdb/releases/influxdb-1.7.0.x86_64.rpm --no-check-certificate [[email protected] ~]#

Linux下磁盘IO读写性能测试脚本

#!/bin/sh #author:reed #blog:luweikai.blog.51cto.com #说明:使用自带的dd命令 file=dd.file BS_COUNT_8K=(8K 12K) BS_COUNT_64K=(64K 6K) BS_COUNT_1M=(1M 1K) list="8K 64K 1M" wlog=/tmp/ddwrite.log rlog=/tmp/ddread.log #write Write() {         echo "[INFO]

grafana+influxDB+Telegraf 监控

之前从来没接触过这三个东西,所以这里先从基本了解.Grafana是一个开源的度量分析和可视化套件.这是最常用的可视化的时间序列数据的基础设施和应用的分析,简单说就是在 web 前端上展示页面,只需要 apache 或 nginx 就可以了,连PHP都不用. influxDB是一个时间序列的数据库,你插入的每条数据会自动附加上两个字段,一个时间,一个序列号(用来作为主键)它有三大特性:时序性(Time Series):与时间相关的函数的灵活使用(诸如最大.最小.求和等):度量(Metrics):对

服务器性能测试,你选哪种工具

众所周知,服务器是整个网络系统和计算平台的核心,许多重要的数据都保存在服务器上,很多网络服务都在服务器上运行,因此服务器性能的好坏决定了整个应用系统的性能. 现在市面上不同品牌.不同种类的服务器有很多种,用户在选购时,怎样从纷繁的型号中选择出所需要的,适合于自己应用的服务器产品,仅仅从配置上判别是不够的,最好能够通过实际测试来筛选.而各种的评测软件有很多种,你应该选择哪个软件测试?下面就介绍一些较典型的测试工具:  (一)服务器整机系统性能测试工具 一台服务器系统的性能可以按照处理器.内存.存储

hadoop自带性能测试

一.TestDFSIO 读写性能测试切换到目录: /opt/hadoop/share/hadoop/mapreduce/ 清空数据hadoop jar hadoop-mapreduce-client-jobclient-2.6.4.jar -cleanhadoop fs -ls /benchmarks/ 写性能测试(10个mapper, 10G)hadoop jar hadoop-mapreduce-client-jobclient-2.6.4.jar TestDFSIO -write 10 -