欢迎参与 8 月 1 日中午 11 点的线上分享,了解 GreptimeDB 联合处理指标和日志的最新方案! 👉🏻 点击加入

Skip to content
On this page
报告
2024-8-30

GreptimeDB vs. SQLite —— 高通 8155 平台上的性能对比报告

为了更加全面地评估 GreptimeDB 在嵌入式和边缘计算环境中的性能,我们将其与 SQLite 进行了详细的对比测试,本文是一份详细的测试报告。

GreptimeDB 的车云一体方案已成功应用于头部新能源车企,解决了毫秒级信号的采集、存储和分析问题,为企业带来了显著的降本增效成果——数据的流量和存储成本更低,数据分析更实时。

但是为了更加全面地评估 GreptimeDB 在嵌入式和边缘计算环境中的性能,我们将其与 SQLite 进行了详细的对比测试。本次测试的目的是评估它们在类似应用场景中的数据处理性能,以验证 GreptimeDB 在物联网,车联网和可观测应用环境中的适应性和优势。

SQLite 是一个小巧、快速并且功能齐全的 SQL 数据库引擎,它被认为是世界上使用最广泛的数据库系统,能够部署在各类移动设备(比如手机、机顶盒、电视)及嵌入到本地应用程序中等等。

本文将对比 GreptimeDB 和 SQLite 在高通骁龙 8155 智能座舱芯片平台上的性能表现,包括读写性能、资源占用和压缩率等。

测试环境

硬件平台:

Chipset(芯片版本)Qualcomm Technologies, Inc SA8155P
Memory(内存)12 GB
Storage(存储)eMMC NAND Flash

软件版本:

GreptimeDB Edgev1.0 商用版
SQLite3.46.0,基于 rusqlite 包装 https://github.com/rusqlite/rusqlite

软件配置

两者都关闭 WAL,默认关闭 GreptimeDB Edge,通过下列命令关闭 SQLite 的 journal 和同步写入:

sql
PRAGMA journal_mode=OFF;
PRAGMA synchronous=OFF;

其他都为默认配置。

测试数据和方法

测试数据

我们同样采用 TSBS 生成的 CPU 监控数据,总共 1000 万行,每行数据有 10 个 Tag 和 Field,加上时间戳,总共 21 个列,样例数据如下:

go
cpu,hostname=host_0,region=eu-central-1,datacenter=eu-central-1a,rack=6,os=Ubuntu15.10,arch=x86,team=SF,service=19,service_version=1,service_environment=test usage_user=58i,usage_system=2i,usage_idle=24i,usage_nice=61i,usage_iowait=22i,usage_irq=63i,usage_softirq=6i,usage_steal=44i,usage_guest=80i,usage_guest_nice=38i 1686441600000000000

建表语句参考附录。SQLite 只对 hostnamets 列做主键索引,这两个列是查询需要,没有将其他 tag 列加入到主键,因为写入性能会非常差。GreptimeDB 索引了所有 tag 列,tsTIME INDEX 约束,并启用了 append 模式。

写入方式

  • GreptimeDB Edge 采用商用 SDK 基于共享内存方式写入,写入效率更高;
  • SQLite 采用批量写入的方式,多行数据合并成单个 INSERT 语句并调用 sqlite3_step 执行,批次大小设置为 32,经过测试,使用更大的批大小对整体吞吐影响不大。
GreptimeDB Edge 基于共享内存的写入更高效

查询方式

写入 1000 万行后执行 SQL 查询,我们从 TSBS 查询场景中挑选了 7 条 SQL 执行,覆盖典型场景,具体见附录。

测试报告

写入性能

由于 SQLite 并不支持多线程的并发写入 ,我们测试了单核极限写入场景:

单核极限写入场景性能对比

GreptimeDB 写入 TPS 大概是 SQLite 的 1.7 倍,达到 7.2 万行每秒。

我们单独测试了 GreptimeDB 的并发写入性能,在平均 160% CPU 消耗并且将 I/O(Input/Output) 打满的情况下,达到了 10 万行每秒的写入性能。

压缩率

除了写入性能外,嵌入式数据库的磁盘占用同样值得关注。由于嵌入式设备往往存储空间并不是很充裕,而且其所使用的存储介质通常为 Flash 闪存,因此如果磁盘占用过大,不仅会导致能够保存的数据量受限,而且会大大缩短存储介质的寿命。在本次测试中,我们将 1000 万行数据全部写入到 GreptimeDB 和 SQLite 后,分别测量两者数据目录所占用的大小。

压缩率对比

得益于 GreptimeDB Edge 所使用的列式存储的极高的压缩率,最终其所占用空间仅为 87MB,而 SQLite 需要 1,686 MB, GreptimeDB 的压缩率是 SQLite 的 19 倍

资源占用

我们将写入限流为 43000 行每秒,测量下 GreptimeDB 和 SQLite 的 CPU 和内存占用:

CPU使用量对比内存使用量对比

结论:

  • GreptimeDB 的 CPU 占用更低,仅为 67%,而 SQLite 为 96%
  • SQLite 的写入过程几乎没有内存分配,优化的非常好,内存稳定地保持在 10MB,而 GreptimeDB Edge 需要消耗 200MB 内存。
  • GreptimeDB Edge 的内存大小可以通过配置优化,得益于良好的架构设计, GreptimeDB Edge 可以在 CPU、内存和压缩率三者之间,根据用户需求灵活通过配置来平衡。

查询性能

我们选取的 7 条典型 SQL 的查询结果如下(查询耗时,单位:毫秒):

查询场景SQLiteGreptimeDB查询场景说明
FIVE_MINUTE_1133查询 1 个主机最近 5 分钟所有指标数据
COUNT25211统计总行数
CPU_MAX_ALL_11652查询 1 个主机 8 个小时内每小时所有 CPU 指标的最大值
CPU_MAX_ALL_811978查询 8 个主机 8 个小时内每小时所有 CPU 指标的最大值
SINGLE_GROUP_BY_1_1_1145105查询 1 个主机 1 个小时内 1 个 CPU 指标每分钟的最大值
LAST_POINT_ALL12461860所有主机的最新一行数据
LAST_POINT_ONE1181401 个主机的最新一行数据
查询对比

可以看到,SQLite 的查询性能相当出色,而 GreptimeDB Edge 也没有明显落后,并且在时序聚合查询场景更快。

总结

在高通 8155 芯片平台上,GreptimeDB Edge 的写入性能是 SQLite 的 1.7 倍,数据压缩率是 SQLite 的 19 倍,查询性能在时序聚合场景更优,资源占用方面 CPU 消耗更低,内存消耗较大,但是可以通过配置灵活地在 CPU、内存和压缩率三者之间分配。

本测试使用的 GreptimeDB Edge 商用版还是 1.0 版本,最新研发的 2.0 版本将支持日志引擎、轻量级流计算引擎 Flow 以及专为嵌入式 LLM 应用设计的向量检索的能力,并且在读写性能和资源占用做出进一步的优化。Greptime 边云一体方案显著降低数据的流量和存储成本,赋能边缘计算,并在边云之间灵活协调算力。

如果您对 GreptimeDB Edge 商用版在智能汽车等边缘环境的使用感兴趣,欢迎联系我们做进一步的交流。

附录

建表语句

GreptimeDB

sql
CREATE TABLE IF NOT EXISTS cpu (
  hostname STRING NULL,
  region STRING NULL,
  datacenter STRING NULL,
  rack STRING NULL,
  os STRING NULL,
  arch STRING NULL,
  team STRING NULL,
  service STRING NULL,
  service_version STRING NULL,
  service_environment STRING NULL,
  usage_user BIGINT NULL,
  usage_system BIGINT NULL,
  usage_idle BIGINT NULL,
  usage_nice BIGINT NULL,
  usage_iowait BIGINT NULL,
  usage_irq BIGINT NULL,
  usage_softirq BIGINT NULL,
  usage_steal BIGINT NULL,
  usage_guest BIGINT NULL,
  usage_guest_nice BIGINT NULL,
  ts TIMESTAMP(9) NOT NULL,
  TIME INDEX (ts),
  PRIMARY KEY (hostname, region, datacenter, rack, os, arch, team, service, service_version, service_environment)
) with (append_mode='true');

SQLite

sql
CREATE TABLE IF NOT EXISTS cpu (
  hostname VARCHAR NULL,
  region VARCHAR NULL,
  datacenter VARCHAR NULL,
  rack VARCHAR NULL,
  os VARCHAR NULL,
  arch VARCHAR NULL,
  team VARCHAR NULL,
  service VARCHAR NULL,
  service_version VARCHAR NULL,
  service_environment VARCHAR NULL,
  usage_user BIGINT NULL,
  usage_system BIGINT NULL,
  usage_idle BIGINT NULL,
  usage_nice BIGINT NULL,
  usage_iowait BIGINT NULL,
  usage_irq BIGINT NULL,
  usage_softirq BIGINT NULL,
  usage_steal BIGINT NULL,
  usage_guest BIGINT NULL,
  usage_guest_nice BIGINT NULL,
  ts TIMESTAMP NOT NULL,
  PRIMARY KEY (hostname, ts)
);

查询语句

1. FIVE_MINUTE_1E

sql
SELECT * FROM cpu WHERE hostname='host_1701' AND ts>='2016-01-01T00:00:00Z' AND ts<'2016-01-01T00:05:00';

2. COUNT

sql
SELECT count(*) FROM cpu;

3. CPU_MAX_ALL_1

sql
-- GreptimeDB
SELECT 
  max(usage_user), 
  max(usage_system), 
  max(usage_idle), 
  max(usage_nice), 
  max(usage_iowait), 
  max(usage_irq), 
  max(usage_softirq), 
  max(usage_steal), 
  max(usage_guest), 
  max(usage_guest_nice), 
  date_trunc('hour', ts) 
FROM 
  cpu
WHERE 
  hostname = 'host_1435' AND 
  ts >= '2016-01-01T00:00:00Z' AND 
  ts < '2016-01-01T08:00:00Z' 
GROUP BY 
  date_trunc('hour', ts);

-- SQLite
SELECT 
  max(usage_user), 
  max(usage_system), 
  max(usage_idle), 
  max(usage_nice), 
  max(usage_iowait), 
  max(usage_irq), 
  max(usage_softirq), 
  max(usage_steal), 
  max(usage_guest), 
  max(usage_guest_nice), 
  strftime('%Y-%m-%dT%H:00:00', ts)
FROM 
  cpu
WHERE 
  hostname = 'host_1435' AND 
  ts >= '2016-01-01T00:00:00Z' AND 
  ts < '2016-01-01T08:00:00Z'
GROUP BY 
  strftime('%Y-%m-%dT%H:00:00', ts);

4. CPU_MAX_ALL_8

sql
SELECT 
  max(usage_user), 
  max(usage_system), 
  max(usage_idle), 
  max(usage_nice), 
  max(usage_iowait), 
  max(usage_irq), 
  max(usage_softirq), 
  max(usage_steal), 
  max(usage_guest), 
  max(usage_guest_nice), 
  date_trunc('hour', ts) 
FROM 
  cpu 
WHERE 
  (
    hostname = 'host_249'     OR 
    hostname = 'host_1403'    OR 
    hostname = 'host_1435'    OR 
    hostname = 'host_3539'    OR 
    hostname = 'host_3639'    OR 
    hostname = 'host_3075'    OR 
    hostname = 'host_815'     OR 
    hostname = 'host_2121'
  )  AND
  ts >= '2016-01-01T00:00:00Z' AND 
  ts < '2016-01-01T08:00:00Z' 
GROUP BY 
  date_trunc('hour', ts)

-- SQLite  
SELECT 
  max(usage_user), 
  max(usage_system), 
  max(usage_idle), 
  max(usage_nice), 
  max(usage_iowait), 
  max(usage_irq), 
  max(usage_softirq), 
  max(usage_steal), 
  max(usage_guest), 
  max(usage_guest_nice), 
  strftime('%Y-%m-%dT%H:00:00', ts)
FROM 
  cpu 
WHERE 
  (
    hostname = 'host_249'     OR 
    hostname = 'host_1403'    OR 
    hostname = 'host_1435'    OR 
    hostname = 'host_3539'    OR 
    hostname = 'host_3639'    OR 
    hostname = 'host_3075'    OR 
    hostname = 'host_815'     OR 
    hostname = 'host_2121'
  ) AND 
  ts >= '2016-01-01T00:00:00Z' AND 
  ts < '2016-01-01T08:00:00Z' 
GROUP BY 
  strftime('%Y-%m-%dT%H:00:00', ts);

5. SINGLE_GROUP_BY_1_1_1

sql
SELECT 
  max(usage_user), 
  date_trunc('minute', ts) 
FROM 
    cpu 
WHERE 
  (hostname = 'host_3701') AND 
  ts >= '2016-01-01T00:00:00Z' AND 
  ts < '2016-01-01T08:00:00Z' 
GROUP BY 
  date_trunc('minute', ts)

-- SQLite
SELECT 
  max(usage_user), 
   strftime('%Y-%m-%dT%H:%M:00', ts)
FROM 
  cpu 
WHERE 
  (hostname = 'host_1701') AND 
  ts >= '2016-01-01T00:00:00Z' AND 
  ts < '2016-01-01T08:00:00Z' 
GROUP BY 
   strftime('%Y-%m-%dT%H:%M:00', ts);

6. LAST_POINT_ALL

sql
-- GreptimeDB
SELECT                                                                                                                                                                           
  last_value(hostname order by ts),
  last_value(region order by ts),
  last_value(datacenter order by ts),
  last_value(rack order by ts),
  last_value(os order by ts),
  last_value(arch order by ts),
  last_value(team order by ts),
  last_value(service order by ts),
  last_value(service_version order by ts),
  last_value(service_environment order by ts),
  last_value(usage_user order by ts),
  last_value(usage_system order by ts),
  last_value(usage_idle order by ts),
  last_value(usage_nice order by ts),
  last_value(usage_iowait order by ts),
  last_value(usage_irq order by ts),
  last_value(usage_softirq order by ts),
  last_value(usage_steal order by ts),
  last_value(usage_guest order by ts),
  last_value(usage_guest_nice order by ts)
FROM cpu GROUP BY hostname;

--SQLite
SELECT 
  last_value(hostname) over(order by ts), 
  last_value(region) over(order by ts), 
  last_value(datacenter) over(order by ts), 
  last_value(rack) over(order by ts), 
  last_value(os) over(order by ts), 
  last_value(arch) over(order by ts), 
  last_value(team) over(order by ts), 
  last_value(service) over(order by ts), 
  last_value(service_version) over(order by ts), 
  last_value(service_environment) over(order by ts), 
  last_value(usage_user) over(order by ts), 
  last_value(usage_system) over(order by ts), 
  last_value(usage_idle) over(order by ts), 
  last_value(usage_nice) over(order by ts), 
  last_value(usage_iowait) over(order by ts), 
  last_value(usage_irq) over(order by ts), 
  last_value(usage_softirq) over(order by ts), 
  last_value(usage_steal) over(order by ts), 
  last_value(usage_guest) over(order by ts), 
  last_value(usage_guest_nice) over(order by ts) 
FROM cpu GROUP BY hostname;

7. LAST_POINT_ONE

sql
-- GreptimeDB Edge
SELECT
  last_value(hostname order by ts),
  last_value(region order by ts),
  last_value(datacenter order by ts),
  last_value(rack order by ts),
  last_value(os order by ts),
  last_value(arch order by ts),
  last_value(team order by ts),
  last_value(service order by ts),
  last_value(service_version order by ts),
  last_value(service_environment order by ts),
  last_value(usage_user order by ts),
  last_value(usage_system order by ts),
  last_value(usage_idle order by ts),
  last_value(usage_nice order by ts),
  last_value(usage_iowait order by ts),
  last_value(usage_irq order by ts),
  last_value(usage_softirq order by ts),
  last_value(usage_steal order by ts),
  last_value(usage_guest order by ts),
  last_value(usage_guest_nice order by ts)
FROM cpu
WHERE hostname='host_1701'

-- SQLite
SELECT
  last_value(hostname) over(order by ts),
  last_value(region) over(order by ts),
  last_value(datacenter) over(order by ts),
  last_value(rack) over(order by ts),
  last_value(os) over(order by ts),
  last_value(arch) over(order by ts),
  last_value(team) over(order by ts),
  last_value(service) over(order by ts),
  last_value(service_version) over(order by ts),
  last_value(service_environment) over(order by ts),
  last_value(usage_user) over(order by ts),
  last_value(usage_system) over(order by ts),
  last_value(usage_idle) over(order by ts),
  last_value(usage_nice) over(order by ts),
  last_value(usage_iowait) over(order by ts),
  last_value(usage_irq) over(order by ts),
  last_value(usage_softirq) over(order by ts),
  last_value(usage_steal) over(order by ts),
  last_value(usage_guest) over(order by ts),
  last_value(usage_guest_nice) over(order by ts)
FROM cpu
WHERE hostname='host_1701'

如果您对 GreptimeDB Edge 商用版在智能汽车等边缘环境的使用感兴趣,欢迎联系我们做进一步的交流。

关于 Greptime

Greptime 格睿科技专注于为可观测、物联网及车联网等领域提供实时、高效的数据存储和分析服务,帮助客户挖掘数据的深层价值。目前基于云原生的时序数据库 GreptimeDB 已经衍生出多款适合不同用户的解决方案,更多信息或 demo 展示请联系下方小助手(微信号:greptime)。

欢迎对开源感兴趣的朋友们参与贡献和讨论,从带有 good first issue 标签的 issue 开始你的开源之旅吧~期待在开源社群里遇见你!添加小助手微信即可加入“技术交流群”与志同道合的朋友们面对面交流哦~

Star us on GitHub Now: https://github.com/GreptimeTeam/greptimedb

官网:https://greptime.cn/

文档:https://docs.greptime.cn/

Twitter: https://twitter.com/Greptime

Slack: https://greptime.com/slack

LinkedIn: https://www.linkedin.com/company/greptime/

性能报告
sqlite

加入我们的社区

获取 Greptime 最新更新,并与其他用户讨论。