写点什么

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

  • 2024-11-01
    北京
  • 本文字数:6351 字

    阅读完需:约 21 分钟

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

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


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


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


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

测试环境

硬件平台:



软件版本:


软件配置

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


PRAGMA journal_mode=OFF;PRAGMA synchronous=OFF;
复制代码


其他都为默认配置。

测试数据和方法

测试数据

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


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,经过测试,使用更大的批大小对整体吞吐影响不大。



(图 1 :GreptimeDB Edge 基于共享内存的写入更高效)

查询方式

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

测试报告

写入性能

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



(图 2 :单核极限写入场景性能对比)


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


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

压缩率

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



(图 3 :压缩率对比)


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

资源占用

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



图 4 :CPU 使用量对比



图 5 :内存使用量对比


结论:


  • GreptimeDB 的 CPU 占用更低,仅为 67%,而 SQLite 为 96%

  • SQLite 的写入过程几乎没有内存分配,优化的非常好,内存稳定地保持在 10MB,而 GreptimeDB Edge 需要消耗 200MB 内存。

  • GreptimeDB Edge 的内存大小可以通过配置优化,得益于良好的架构设计, GreptimeDB Edge 可以在 CPU、内存和压缩率三者之间,根据用户需求灵活通过配置来平衡。

查询性能

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




(图 6 :查询对比)


可以看到,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

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

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

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

2. COUNT

SELECT count(*) FROM cpu;
复制代码

3. CPU_MAX_ALL_1

-- GreptimeDBSELECT   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   cpuWHERE   hostname = 'host_1435' AND   ts >= '2016-01-01T00:00:00Z' AND   ts < '2016-01-01T08:00:00Z' GROUP BY   date_trunc('hour', ts);
-- SQLiteSELECT 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 cpuWHERE 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

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

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)
-- SQLiteSELECT 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

-- GreptimeDBSELECT                                                                                                                                                                             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;
--SQLiteSELECT 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

-- GreptimeDB EdgeSELECT  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 cpuWHERE hostname='host_1701'
-- SQLiteSELECT 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 cpuWHERE 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/

用户头像

专注于 Infra 技术分享 2022-09-23 加入

分布式、高性能、存储计算分离的开源云原生时序数据库

评论

发布
暂无评论
GreptimeDB vs. SQLite —— 高通 8155 平台上的性能对比报告_sqlite_Greptime 格睿科技_InfoQ写作社区