IoT(Internet of Things)正在高速增長,越來越多裝置開始逐步走進日常生活,例如智能路由器、各種電視棒、天貓精靈、掃地機器人等,讓我們體驗到智能領域的便利。傳統軟體領域的嵌入式開發模式在IoT裝置領域的應用遇到了很多挑戰,IoT裝置數目多、分布廣,難以調試且硬體受限,傳統的裝置日誌解決方案無法完美滿足需求。
Log Service團隊結合IoT裝置的特點,為IoT裝置量身定製一套日誌資料擷取方案:C Producer。

嵌入式開發需求
作為IoT/嵌入式工程師,除了需要深厚的開發功底外,面對海量的裝置,如何有能力管理、監控、診斷黑盒裝置至關重要。嵌入式開發需求主要有以下幾點:
資料擷取:如何即時採集分散在全球各地的百萬/千萬級裝置上的資料?
調試:如何使用一套方案既滿足線上資料擷取又滿足開發時的Just-in-Time 偵錯?
線上診斷:某個線上裝置出現錯誤,如何快速定位裝置,查看引起該裝置出錯的上下文是什嗎?
監控:當前有多少個裝置線上?工作狀態分布如何?地理位置分布如何?出錯裝置如何即時警示?
資料即時分析:裝置產生資料如何與Realtime Compute、巨量資料倉庫對接,構建使用者畫像?

IoT領域面臨的主要挑戰
思考以上問題的解決方案,我們發現在傳統軟體領域那一套手段面臨IoT領域基本全部失效,主要挑戰來自於IoT裝置這些特點:
裝置數目多:在傳統營運領域管理1萬台伺服器屬於一家大公司了,但10萬線上對於IoT裝置而言只是一個小門檻。
分布廣:硬體一旦部署後,往往會部署在全國、甚至全球各地。
黑盒:難以登入並調試,大部分情況屬於不可知狀態。
資源受限:出於成本考慮,IoT裝置硬體較為受限(例如總共只有32MB記憶體),傳統PC領域手段往往失效。
C Producer
Log Service量身定製的日誌資料擷取解決方案。
Log Service用戶端Logtail在X86伺服器上有百萬級部署,可以參見文章:Logtail技術分享:,。除此之外,Log Service提供多樣化的採集方案:
移動端SDK:Android/iOS平台資料擷取,一天已有千萬級DAU。
Web Tracking(JS):類似百度統計,Analytics輕量級採集方式,無需簽名。
Log Service團隊結合IoT裝置的特點,為IoT裝置量身定製一套日誌資料擷取方案:C Producer。

C Producer特點
C Producer Library繼承Logtail穩定、高效能、低資源消耗等特點,可以定位是一個輕量級Logtail,雖沒有Logtail即時組態管理機制,但具備除此之外70%功能,包括:
提供多租戶概念:可以對多種日誌(例如Metric,DebugLog,ErrorLog)進行優先順序分級處理,同時配置多個用戶端,每個用戶端可獨立配置採集優先順序、目標Project和LogStore等。
支援上下文查詢:同一個用戶端產生的日誌在同一上下文中,支援查看某條日誌前後相關日誌。
並發發送,斷點續傳:支援緩衝上限可設定,超過上限後日誌寫入失敗。
此外,C Producer還具備以下IoT裝置專享功能,例如:
本地調試:支援將日誌內容輸出到本地,並支援輪轉、日誌數、輪轉大小設定。
細粒度資源控制:支援針對不同類型資料/日誌設定不同的緩衝上限、彙總方式。
日誌壓縮緩衝:支援將未發送成功的資料壓縮緩衝,減少裝置記憶體佔用。

功能優勢
C Producer作為IoT裝置的量身定製方案,在以下方面具備明顯優勢:

用戶端高並發寫入:可配置的發送線程池,支援每秒數十萬條日誌寫入,詳情參見效能測試。
低資源消耗:每秒20萬日誌寫入只消耗70%CPU;同時在低效能硬體(例如樹莓派)上,每秒產生100條日誌對資源基本無影響。
用戶端日誌不落盤:即資料產生後直接通過網路發往服務端。
用戶端計算與I/O邏輯分離:日誌非同步輸出,不阻塞背景工作執行緒。
支援多優先順序:不同用戶端可配置不同的優先順序,保證高優先順序日誌最先發送。
本地調試:支援設定本地調試,便於您在網路不通的情況下本地測試應用程式。
在以上情境中,C Producer Library簡化您程式開發的步驟。您無需關心日誌採集細節實現、也不用擔心日誌採集會影響您的業務正常運行,大大降低資料擷取門檻。
C Producer方案與其他嵌入式採集方案對比如下:
類別 | C Producer | 其他方案 | |
編程 | 平台 | 移動端+嵌入式 | 移動端為主 |
上下文 | 支援 | 不支援 | |
多日誌 | 支援 | 不支援(一種日誌) | |
自訂格式 | 支援 | 不支援(提供若干個有限欄位) | |
優先順序 | 支援 | 不支援 | |
環境參數 | 可配置 | 可配置 | |
穩定性 | 並發度 | 高 | 一般 |
壓縮演算法 | LZ4(效率與效能平衡)+GZIP | 最佳化 | |
低資源消耗 | 最佳化 | 一般 | |
傳輸 | 斷電續傳 | 支援 | 預設不支援,需要二次開發 |
存取點 | 8(中國)+8(全球) | 杭州 | |
調試 | 本地日誌 | 支援 | 手動支援 |
參數配置 | 支援 | 不支援 | |
即時性 | 服務端可見 | 1秒(99.9%),3秒(Max) | 1-2小時 |
自訂處理 | 15+對接方式 | 定製化即時+離線方案 | |
C Producer+Log Service解決方案
C Producer結合阿里雲Log Service產品配合使用,即可完成IoT裝置日誌全套解決方案。
規模大
支援億層級用戶端即時寫入。
支援PB/Day資料量。
速度快
採集快:寫入零延遲,寫入即可消費。
查詢快:一秒內,複雜查詢(5個條件)可處理10億級資料。
分析快:一秒內,複雜分析(5個維度彙總+GroupBy)可彙總億層級資料。
對接廣
與阿里雲各類產品無縫打通。
各種開源格式儲存、計算、可視化系統完美相容。

下載與使用
下載地址:Github
一個應用可建立多個Producer,每個Producer可包含多個Client,每個Client可單獨配置目的地址、記錄層級、是否本地調試、緩衝大小、自訂標識、topic等資訊。
詳細安裝方式及操作步驟,請參見README。

效能測試
環境配置
高效能情境:傳統X86伺服器。
低效能情境:樹莓派(低功耗環境)。
配置如下:

C Producer配置
ARM(樹莓派)
緩衝:10 MB
彙總時間:3秒(彙總時間、彙總資料包大小、彙總日誌數任一滿足即打包發送)
彙總資料包大小:1 MB
彙總日誌數:1000
發送線程:1
自訂tag:5
X86
緩衝:10MB
彙總時間:3秒(彙總時間、彙總資料包大小、彙總日誌數任一滿足即打包發送)
彙總資料包大小:3 MB
彙總日誌數:4096
發送線程:4
自訂tag:5
日誌範例(9個索引值對,資料量約為350位元組)
__source__: 192.0.2.1
__tag__:1: 2
__tag__:5: 6
__tag__:a: b
__tag__:c: d
__tag__:tag_key: tag_value
__topic__: topic_test
_file_: /disk1/workspace/tools/aliyun-log-c-sdk/sample/log_producer_sample.c
_function_: log_producer_post_logs
_level_: LOG_PRODUCER_LEVEL_WARN
_line_: 248
_thread_: 40978304
LogHub: Real-time log collection and consumption
Search/Analytics: Query and real-time analysis
Interconnection: Grafana and JDBC/SQL92
Visualized: dashboard and report functions測試結果
X86平台結果
C Producer可以輕鬆到達90 MB/s的發送速度,每秒上傳日誌20萬,佔用CPU只有70%,記憶體140 MB。
伺服器在200條/s,發送資料對於CPU基本無影響(降低到0.01%以內)。
客戶線程發送一條資料(輸出一條日誌)的平均耗時為1.2 us。

樹莓派平台結果
在樹莓派的測試中,由於CPU的頻率只有600 MHz,效能差不多是伺服器的1/10左右,每秒可發送最多2萬條日誌。
樹莓派在20條/s的時候,發送資料對於CPU基本無影響(降低到0.01%以內)。
客戶線程發送一條資料(輸出一條日誌)的平均耗時為:12 us左右(樹莓派通過USB串連到PC共用網路)。
