2017年12月19日至20日,2017云栖大会·北京峰会在国家会议中心召开,飞天智能是贯穿云栖大会不变的主题,云计算、大数据、人工智能、物联网等热门话题备受各方关注。其中阿里云日志服务发布的嵌入式日志采集客户端(C Producer Library) 就是其中解决物联网日志采集、分析难的利器。html
背景
IoT(Internet of Things)正在高速增加,愈来愈多设备开始逐步走进平常生活(例如智能路由器、各类电视棒、天猫精灵、扫地机器人),让咱们体验到智能领域的便利。距Gartner预测,到2020年底预计会有200亿智能设备,可见该领域的巨大市场。git
做为IoT/嵌入式工程师,除了须要深厚的开发功底外,面对海量的设备,如何有能力管理、监控、诊断这些“黑盒”设备相当重要。咱们总结了嵌入式开发需求,主要有如下几点:github
- 数据采集:如何实时采集分散在全球各地的百万/千万级设备上的数据?
- 调试:如何使用一套方案既知足线上数据采集以及开发时的实时调试?
- 线上诊断:某个线上设备出现错误,如何快速定位设备,查看引发该设备出错的上下文是什么?
- 监控:当前有多少个设备在线?工做状态分布如何?地理位置分布如何?出错设备如何实时告警?
- 数据实时分析:设备产生数据如何与实时计算、大数据仓库对接,构建用户画像?
思考以上问题的解决方案,咱们发如今传统软件领域那一套手段面临IoT领域基本所有失效,主要挑战来自于IoT设备这些特色:缓存
- 数目多:在传统运维领域管理1W台服务器属于一家大公司了,但10W在线对于IoT设备而言只是一个小门槛
- 分布广:硬件一旦部署后,每每会部署在全国、甚至全球各地
- 黑盒:难以登录并调试,大部分状况属于不可知状态
- 资源受限:出于成本考虑,IoT设备硬件较为受限(例如总共只有32MB内存),传统PC领域手段每每失效
针对不一样端的数据采集
日志服务(原SLS) 客户端Logtail在X86服务器上有百万级部署,能够参见文章:Logtail技术分享 : 多租户隔离技术+双十一实战效果,Polling + Inotify 组合下的日志保序采集方案。除此以外咱们还有如下几种方式:服务器
- 移动端SDK:Android/IOS平台数据采集,一天已有千万级DAU
- Web Tracking(JS):相似百度统计,Google Analytics 轻量级采集方式,无需签名
在IoT领域,咱们从多年Logtail的开发经验中,汲取其中精华的部分,并结合IoT设备针对CPU、内存、磁盘、网络、应用方式等特色,开发出一套专为IoT定制的日志数据采集方案:C Producer网络

C Producer特色
C Producer Library 继承Logtail稳定、边界特色,能够定位是一个“轻量级Logtail”,虽没有Logtail实时配置管理机制,但具有除此以外70%功能,包括:并发
- 提供多租户概念:能够对多种日志(例如Metric,DebugLog,ErrorLog)进行优先级分级处理,同时配置多个客户端,每一个客户端可独立配置采集优先级、目的project/logstore等
- 支持上下文查询:同一个客户端产生的日志在同一上下文中,支持查看某条日志先后相关日志
- 并发发送,断点续传:支持缓存上线可设置,超过上限后日志写入失败
还有一些专门为IoT准备功能,例如:运维
- 本地调试:支持将日志内容输出到本地,并支持轮转、日志数、轮转大小设置
- 细粒度资源控制:支持针对不一样类型数据/日志设置不一样的缓存上线、聚合方式
- 日志压缩缓存:支持将未发送成功的数据压缩缓存,减小设备内存占用

功能优点
C-Producer是量身为IoT定制的方案,所以会有一些特定考虑:异步

- 客户端高并发写入:可配置的发送线程池,支持每秒数十万条日志写入,详情参见性能测试
- 低资源消耗:每秒20W日志写入只消耗70% CPU;同时在低性能硬件(例如树莓派)上,每秒产生100条日志对资源基本无影响
- 客户端日志不落盘:既数据产生后直接经过网络发往服务端
- 客户端计算与 I/O 逻辑分离:日志异步输出,不阻塞工做线程
- 支持多优先级:不通客户端可配置不一样的优先级,保证高优先级日志最早发送。
- 本地调试:支持设置本地调试,便于您在网络不通的状况下本地测试应用程序。
在以上场景中,C Producer Library 会简化您程序开发的步骤,您无需关心日志采集细节实现、也不用担忧日志采集会影响您的业务正常运行,大大下降数据采集门槛。高并发
为了有一个感性认识,咱们对C-Producer 方案与其余嵌入式采集方案作了一个对比,以下:

总体解决方案
C-Producer + 日志服务能够给IoT带来什么?答案是:IoT日志解决方案:
规模大
- 支持亿级别客户端实时写入
- 支持 PB/Day 数据量
速度快
采集快:0延迟:写入0延迟,写入便可消费
- 查询快:一秒内,复杂查询(5个条件)可处理10亿级数据
- 分析快:一秒内,复杂分析(5个维度聚合+GroupBy)可聚合亿级别数据
对接广
- 与阿里云各种产品无缝打通
- 各类开源格式存储、计算、可视化系统完美兼容

如何使用
一个应用可建立多个producer,每一个producer可包含多个client,每一个client可单独配置目的地址、日志level、是否本地调试、缓存大小、自定义标识、topic等信息。

性能测试
环境配置:传统X86服务器,树莓派(低功耗环境),配置分别以下:

C-Producer配置
ARM(树莓派)
- 缓存:10MB
- 聚合时间:3秒 (聚合时间、聚合数据包大小、聚合日志数任一知足即打包发送)
- 聚合数据包大小:1MB
- 聚合日志数:1000
- 发送线程:1
- 自定义tag : 5
X86
- 缓存:10MB
- 聚合时间:3秒 (聚合时间、聚合数据包大小、聚合日志数任一知足即打包发送)
- 聚合数据包大小:3MB
- 聚合日志数:4096
- 发送线程:4
- 自定义tag : 5
日志样例
- 10个键值对,总数据量约为600字节
- 9个键值对,数据量约为350字节

测试结果
X86平台结果
- C Producer能够轻松到达90M/s的发送速度,每秒上传日志20W,占用CPU只有70%,内存140M
- 服务器在200条/s,发送数据对于cpu基本无影响(下降到0.01%之内)
- 客户线程发送一条数据(输出一条log)的平均耗时为:1.2us

树莓派平台结果
- 在树莓派的测试中,因为CPU的频率只有600MHz,性能差很少是服务器的1/10左右,最高每秒可发送2W条日志
- 树莓派在20条/s的时候,发送数据对于cpu基本无影响(下降到0.01%之内)
- 客户线程发送一条数据(输出一条log)的平均耗时为:12us左右(树莓派经过USB链接到PC共享网络)

一些典型场景能够参见云栖论坛 和最佳实践。