主頁 >  其他 > 降低 80% 的讀寫回應延遲!我們測評了 etcd 3.4 新特性(內含讀寫發展史)

降低 80% 的讀寫回應延遲!我們測評了 etcd 3.4 新特性(內含讀寫發展史)

2020-09-17 12:12:41 其他

file

作者 | 陳潔(墨封) 阿里云開發工程師

導讀:etcd 作為 K8s 集群中的存盤組件,讀寫性能方面會受到很多壓力,而 etcd 3.4 中的新特性將有效緩解壓力,本文將從 etcd 資料讀寫機制的發展歷史著手,深入解讀 etcd 3.4 新特性,

背景

etcd 是 Kubernetes 集群中存盤元資料,保證分布式一致性的組件,它的性能往往影響著整個集群的回應時間,而在 K8s 的使用中,我們發現除了日常的讀寫壓力外,還存在某些特殊的場景會對 etcd 造成巨大的壓力,比如 K8s 下 apiserver 組件重啟或是其他組件繞過 apiserver cache 直接查詢 etcd 最新資料的情況時,etcd 會收到大量的 expensive read(后文會介紹該概念)請求,這對 etcd 讀寫會造成巨大的壓力,更為嚴重的是,如果客戶端中存在失敗重試邏輯或客戶端數目較多,會產生大量這樣的請求,嚴重情況可能造成 etcd crash,

etcd 3.4 中增加了一個名為“Fully Concurrent Read”的特性,較大程度上解決了上述的問題,在這篇文章中我們將重點解讀它,本篇文章首先回顧 etcd 資料讀寫機制發展的歷史,之后剖析為何這個特性能大幅提升 expensive read 場景下 etcd 的讀寫性能,最后通過真實實驗驗證該特性的效果,

etcd 讀寫發展歷史

etcd v3.0 及之前早期版本

etcd 利用 Raft 演算法實作了資料強一致性,它保證了讀操作的線性一致性,在 raft 演算法中,寫操作成功僅僅以為著寫操作被 commit 到日志上,并不能確保當前全域的狀態機已經 apply 了該寫日志,而狀態機 apply 日志的程序相對于 commit 操作是異步的,因此在 commit 后立即讀取狀態機可能會讀到過期資料,

為了保證線性一致性讀,早期的 etcd(_etcd v3.0 _)對所有的讀寫請求都會走一遍 Raft 協議來滿足強一致性,然而通常在現實使用中,讀請求占了 etcd 所有請求中的絕大部分,如果每次讀請求都要走一遍 raft 協議落盤,etcd 性能將非常差,

etcd v3.1

因此在 etcd v3.1 版本中優化了讀請求(PR#6275),使用的方法滿足一個簡單的策略:每次讀操作時記錄此時集群的 commit index,當狀態機的 apply index 大于或者等于 commit index 時即可回傳資料,由于此時狀態機已經把讀請求所要讀的 commit index 對應的日志進行了 apply 操作,符合線性一致讀的要求,便可回傳此時讀到的結果,

根據 Raft 論文 6.4 章的內容,etcd 通過 ReadIndex 優化讀取的操作核心為以下兩個指導原則:

  • 讓 Leader 處理 ReadIndex 請求,Leader 獲取的 commit index 即為狀態機的 read index,follower 收到 ReadIndex 請求時需要將請求 forward 給 Leader;
  • 保證 Leader 仍然是目前的 Leader,防止因為網路磁區原因,Leader 已經不再是當前的 Leader,需要 Leader 廣播向 quorum 進行確認,

ReadIndex 同時也允許了集群的每個 member 回應讀請求,當 member 利用 ReadIndex 方法確保了當前所讀的 key 的操作日志已經被 apply 后,便可回傳客戶端讀取的值,對 etcd ReadIndex 的實作,目前已有相對較多的文章介紹,本文不再贅述,

etcd v3.2

即便 etcd v3.1 中通過 ReadIndex 方法優化了讀請求的回應時間,允許每個 member 回應讀請求,但當我們把視角繼續下移到底層 k/v 存盤 boltdb 層,每個獨立的 member 在獲取 ReadIndex 后的讀取任然存在性能問題,

v3.1 中利用 batch 來提高寫事務的吞吐量,所有的寫請求會按固定周期 commit 到 boltDB,當上層向底層 boltdb 層發起讀寫事務時,都會申請一個事務鎖(如以下代碼片段),該事務鎖的粒度較粗,所有的讀寫都將受限,對于較小的讀事務,該鎖僅僅降低了事務的吞吐量,而對于相對較大的讀事務(后文會有詳細解釋),則可能阻塞讀、寫,甚至 member 心跳都有可能出現超時,

// release-3.2: mvcc/kvstore.go
func (s *store) TxnBegin() int64 {
	...
	s.tx = s.b.BatchTx()
    // boltDB 事務鎖,所有的讀寫事務都需要申請該鎖
	s.tx.Lock()
	...
}

針對以上提到的性能瓶頸,etcd v3.2 版本中對 boltdb 層讀寫進行優化,包含以下兩個核心點:

  • 實作“N reads 或 1 write”的并行,將上文提到的粗粒度鎖細化成一個讀寫鎖,所有讀請求間相互并行;
  • 利用 buffer 來提高了吞吐量,3.2 中對 readTx,batchTx 分別增加了一個 buffer,所有讀事務優先從 buffer 進行讀取,未命中再通過事務訪問 boltDB,同樣,寫事務在寫 boltDB 的同時,也會向 batchTx 的 buffer 寫入資料,而 batch commit 結束時,batchTx 的 buffer 會 writeBack 回 readTx 的 buffer 防止臟讀,
// release-3.3: mvcc/kvstore_txn.go
func (s *store) Read() TxnRead {
	tx := s.b.ReadTx()
    // 獲取讀事務的 RLock 后進行讀操作
	tx.RLock()
}

// release-3.3: mvcc/backend/batch_tx.go
func (t *batchTxBuffered) commit(stop bool) {
    // 獲取讀事務的 Lock 以確保 commit 之前所有的讀事務都已經被關閉
	t.backend.readTx.Lock()
	t.unsafeCommit(stop)
	t.backend.readTx.Unlock()
}

完全并發讀

etcd v3.2 的讀寫優化解決了大部分讀寫場景的性能瓶頸,但我們再從客戶端的角度出發,回到文章開頭我們提到的這種場景,仍然有導致 etcd 讀寫性能下降的危險,

這里我們先引入一個 expensive read 的概念,在 etcd 中,所有客戶端的讀請求最后都是轉化為 range 的請求向 KV 層進行查詢,我們以一次 range 的 key 數量以及 value size 來衡量一次 read 請求的壓力大小,綜合而言,當 range 請求的 key 數量越多,平均每個 key 對應的 value size 越大,則該 range 請求對 DB 層的壓力就越大,而實際劃分 expensive read 和 cheap read 邊界視 etcd 集群硬體能力而定

從客戶端角度,在大型集群中的 apiserver 進行一次 pod、node、pvc 等 resource 的全量查詢,可以視為一次 expensive read,簡要分析下為何 expensive read 會對 boltDB 帶來壓力,上文提到,為了防止臟讀,需要保證每次 commit 時沒有讀事務進行,因此寫事務每次 commit 之前,需要將當前所有讀事務進行回滾,所以 commit interval 時間點上需要申請 readTx.lock ,會將該鎖從 RLock() 升級成 Lock() ,該讀寫鎖的升級會可能導致所有讀操作的阻塞,

如下圖(以下圖中,藍色條為讀事務,綠色條為寫事務,紅色條為事務因鎖問題阻塞),t1 時間點會觸發 commit,然而有事務未結束,T5 commit 事務因申請鎖被阻塞到 t2 時間點才進行,理想狀態下大量的寫事務會在一個 batch 中結束,這樣每次 commit 的寫事務僅僅阻塞少部分的讀事務(如圖中僅僅阻塞了 T6 這個事務),

file

然而此時如果 etcd 中有非常大的讀請求,那么該讀寫鎖的升級將被頻繁阻塞,如下圖,T3 是一個非常長的讀事務,跨過了多個 commit batch,每個 commit batch 結束時間點照常觸發了 commit 的寫事務,然而由于讀寫鎖無法升級,寫事務 T4 被推遲,同樣 t2 commit 點的寫事務 T7 因為申請不到寫鎖一樣也被推遲,

此外,在寫事務的 commit 進行了之后,需要將寫快取里的 bucket 資訊寫入到讀快取中,此時同樣需要升級 readTx.lockLock() ,而上層呼叫 backend.Read() 獲取 readTx 時,需要確保這些 bucket 快取已經成功寫過來了,需要申請讀鎖 readTx.RLock() ,而如果這期間存在寫事務,該鎖則無法得到,這些讀事務都無法開始,如上的情形下,在第三個 batch(t2-t3)中其他讀事務因為得不到讀鎖都無法進行了,

file

總結而言,因 expensive read 造成讀寫鎖頻繁升級,導致寫事務的 commit 不斷被后移(通常我們將這種問題叫做 head-of-line blocking),從而導致 etcd 讀寫性能雪崩,

etcd v3.4 中,增加了一個** “Fully Concurrent Read” **的 feature,核心指導思想是如下兩點:

  • 將上述讀寫鎖去除(事實上是對該鎖再次進行細化),使得所有讀和寫操作不再因該鎖而頻繁阻塞;
  • 每個 batch interval 不再 reset 讀事務 readTxn ,而是創建一個新的 concurrentReadTxn 實體去服務新的讀請求,而原來的 readTxn 在所有事務結束后會被關閉,每個 concurrentReadTxn 實體擁有一片自己的 buffer 快取,

除了以上兩點變動外,fully concurrent read 在創建新的 ConcurrentReadTx 實體時需要從 ReadTx copy 對應的 buffer map,會存在一定的額外開銷,社區也在考慮將這個 copy buffer 的操作 lazy 化,在每個寫事務結束后或者每個 batch interval 結束點進行,然而在我們的實驗中發現,該 copy 帶來的影響并不大,改動的核心代碼如以下片段所示:

// release-3.4: mvcc/backend/read_tx.go
type concurrentReadTx struct {
    // 每個 concurrentReadTx 實體保留一份 buffer,在創建時從 readTx 的 buffer 中獲得一份 copy
	buf     txReadBuffer
	...
}

// release-3.4: mvcc/backend/backend.go
func (b *backend) ConcurrentReadTx() ReadTx {
    // 由于需要從 readTx 拷貝 buffer,創建 concurrentReadTx 時需要對常駐的 readTx 上讀鎖,
	b.readTx.RLock()
	defer b.readTx.RUnlock()
	...
}

// release-3.4: mvcc/backend/read_tx.go
// concurrentReadTx 的 RLock 中不做任何操作,不再阻塞讀事務
func (rt *concurrentReadTx) RLock() {}

// release-3.4: mvcc/kvstore_tx.go
func (s *store) Read() TxnRead {
	// 呼叫 Read 介面時,回傳 concurrentReadTx 而不是 readTx
    tx := s.b.ConcurrentReadTx()
    // concurrentReadTx 的 RLock 中不做任何操作
    tx.RLock()
}

我們再回到上文提到的存在 expensive read 的場景,在 fully concurrent read 的改動之后,讀寫場景如下圖所示,

首先在 mvcc 創建 backend 時會創建一個常駐的 readTx 實體,和之后的寫事務 batchTx 存在鎖沖突的也僅僅只有這一個實體,之后的所有讀請求(例如 T1,T2,T3 等),會創建一個新的 concurrentReadTx 實體進行服務,同時需要從 readTx 拷貝 buffer;當出現 expensive read 事務 T3 時,T4 不再被阻塞并正常執行,同時 T5 需要等待 T4 commit 完成后, readTx 的 buffer 被更新后,再進行 buffer 拷貝,因此阻塞一小段時間,而 t2、t3 commit 時間點的寫事務 T7、T8 也因為沒有被阻塞而順利進行,

file

在 fully concurrent read 的讀寫模式下, concurrentReadTx 僅在創建時可能存在阻塞(因為依賴從 readTx 進行 buffer 拷貝的操作),一旦創建后則不再有阻塞的情況,因此整個流程中讀寫吞吐量有較大的提升,

讀寫性能驗證實驗

針對 etcd v3.4 fully concurrent read 的新 feature,我們在集群中進行了實驗對比增加該 feature 前后讀寫性能的變化,為了排除網路因素干擾,我們做了單節點 etcd 的測驗,但是已經足以從結果上看出該 feature 的優勢,以下是驗證實驗的設定:

  • 讀寫設定
    • 模擬集群已有存盤量,預先寫入** 100k KVs**,每個 KV 由一個128B key和 一個 1~32KB 隨機的 values 組成(平均 16KB)
    • expensive read:每次 range 20k keys,每秒 1 并發,
    • cheap read:每次 range 10 keys,每秒 100 并發,
    • write:每次 put 1 key,每秒 20 并發,
  • 對照組
    • 普通讀寫場景:cheap read + write;
    • 模擬存在較重的讀事務的場景:cheap read + expensive read + write,
  • 對比版本:
    • etcd - ali2019rc2 未加入該優化
    • etcd - ali2019rc3 加入該優化
  • 防止偶然性:每組 test case 跑 5 次,取 99 分位(p99)的回應時間的平均值作為該組 test case 的結果,

實驗結果如下表所示,對于普通讀寫場景,3.4 中的讀寫性能和 3.3 近似;對于存在較重的讀事務的場景,3.4 中的 fully concurrent read feature 一定程度降低了 expensive read 的回應時間,而在該場景下的 cheap read 和 write,rc2 中因讀寫鎖導致讀寫速度非常緩慢,而 rc3 中實作的完全并行使得讀寫回應時間減少到約為原來的 1/7,

| etcd

version | cheap

read + write | | expensive

read + cheap read + write
p99 read (ms) p99 write (ms)
read (ms) p99 cheap read (ms) p99 write (ms)
3.3 14.1 15.1
3.4 (with FCR) 16.1 14.2

其他場景下,如在 Kuberentes 5000節點性能測驗,也表明在大規模讀壓力下,P99 寫的延時降低 97.4%,

總結

etcd fully concurrent read 的新 feature 優化 expensive 降低了近 85% 的寫回應延遲以及近 80% 的讀回應延遲,同時提高了 etcd 的讀寫吞吐量,解決了在讀大壓力場景下導致的 etcd 性能驟降的問題,調研和實驗的程序中感謝宇慕的指導,目前我們已經緊跟社區應用了該新能力,經過長時間測驗表現穩定,未來我們也會不斷優化 etcd 的性能和穩定性,并將優化以及最佳實踐經驗反饋回社區,

參考文獻

  • Etcd Fully Concurrent Read Design Proposal
  • Strong consistency models
  • Attiya H, Welch J L. Sequential consistency versus linearizability[J]. ACM Transactions on Computer Systems (TOCS), 1994, 12(2): 91-122.
  • Ongaro D, Ousterhout J. In search of an understandable consensus algorithm[C]//2014 {USENIX} Annual Technical Conference ({USENIX}{ATC} 14). 2014: 305-319. [raft paper]

“ 阿里巴巴云原生微信公眾號(ID:Alicloudnative)關注微服務、Serverless、容器、Service Mesh等技術領域、聚焦云原生流行技術趨勢、云原生大規模的落地實踐,做最懂云原生開發者的技術公眾號,”

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/65519.html

標籤:其他

上一篇:【LeetCode】25.K個一組翻轉鏈表

下一篇:exosip注冊失敗,回傳-3 OSIP_WRONG_STATE錯誤

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more