安迪熊

技術、閱讀、生活


  • 首頁

  • 關於

  • 標籤

  • 分類

  • 站點地圖

  • 搜尋

[vSAN] VMware vSAN OSA & ESA 技術簡介

發表於 2024-09-07 | 分類於 vSAN |
字數統計: 2.2k

隨著 VMware vSAN 的演進,最新的 vSAN 版本分為兩種架構:原生的 vSAN Original Storage Architecture (OSA) 和全新的 vSAN Express Storage Architecture (ESA)。這兩者在架構上的差異,不僅影響了儲存效能和資源配置,也改變了 vSAN 的未來發展方向。在這篇文章中,我們將深入探討 OSA 與 ESA 的架構差異,並簡單提及配置上的不同之處,同時也會介紹一下 LFS、B-tree 的原理與應用。

架構上的關鍵差異

vSAN OSA 是在 vSAN 8 之前的 vSAN 版本架构基础上更新发展而来的,它同样使用双层架构,使用市场上广为存在,且通过兼容性验证的高速 SSD 作为寫入Cache层,加上 HDD 或 SSD 作为容量层的架构提供 HCI 集群儲存资源。ESA 則是完全為 NVMe 設計的單層儲存架構,整個就是為高效能而生,SSD 不再只是快取,而是主力。資料處理變得更快、更直接,少了中間的拖泥帶水,讀寫效率自然大幅提升。之所以有這樣的改變是因為舊有的儲存架構沒辦法再透過替換更快的硬碟來達到等比例的性能提升了。

閱讀全文 »

[Go] 用Fx進行依賴注入(Dependency Injection)

發表於 2024-06-01 | 分類於 Go |
字數統計: 1.1k

什麼是依賴注入?

首先,什麼是依賴注入呢?依賴注入(Dependency Injection,簡稱DI)是一種設計模式,主要用來解決物件之間的依賴性問題。當一個物件需要使用另一個物件時,我們通常會在這個物件的內部去創建它所需的依賴物件。這樣一來,物件之間就會產生緊密的耦合性,使得程式碼變得不靈活,也很難進行測試和維護。

依賴注入的目的是將依賴物件的創建責任轉移給外部系統,通過單例模式或構造函數(constructor)來將依賴注入到需要的物件中。這樣一來,我們可以更方便地替換或擴展物件的依賴,也能更容易進行單元測試,因為可以輕鬆地注入模擬物件(mock objects)。

傳統的依賴注入

在進入主題之前,我們來看一個不使用任何依賴注入框架的範例:

閱讀全文 »

[Go] Go專案的高效開發技巧

發表於 2024-05-21 | 分類於 Go |
字數統計: 1.3k

Go 語言以其簡潔的語法、高效的性能和出色的併發支持,成為許多開發者心中的首選。然而,在實際的開發中,為了讓專案順利進行,我們不僅需要了解語言本身,還需要掌握一些高效的開發技巧。這篇文章將介紹幾個在 Go 專案開發中常用的技巧,幫助你在開發過程中更有效率、更有條理地進行工作。

1. 理解 Go Modules 和依賴管理

在開始任何 Go 專案之前,了解並正確使用 Go Modules 是至關重要的。Go Modules 是 Go 官方提供的package管理工具,讓你可以輕鬆管理專案中的第三方Library。

如何使用 Go Modules

  • 初始化專案:

    使用 go mod init 命令初始化你的 Go 專案:

    1
    go mod init myproject

    這將創建一個 go.mod 檔案,用於記錄專案的Library依賴關係。

閱讀全文 »

[Go] 記憶體管理: 垃圾回收機制

發表於 2024-05-16 | 分類於 Go |
字數統計: 1.9k

在程式開發的過程中,記憶體管理是一個非常重要的議題。如果記憶體管理不當,可能會導致程式崩潰或效能下降。在 Go 語言中,記憶體管理的關鍵就在於它的垃圾回收(Garbage Collection,簡稱 GC)機制。垃圾回收能自動管理記憶體,減輕開發者的負擔,讓我們更專注於程式的邏輯與功能開發。今天,我們就來深入了解一下 Go 語言的垃圾回收機制,以及它是如何提高程式效能的。同時,作為一個擅長 Python 的程式語言愛好者,我們也將比較 Go 與 Python 在垃圾回收方面的不同。

什麼是垃圾回收?

簡單來說,垃圾回收是一種自動管理記憶體的技術。它負責回收不再使用的記憶體空間,防止記憶體洩漏。這就像有個勤快的清潔工,不停地清理不再需要的雜物,讓房間保持整潔有序。

垃圾回收的基本流程

  1. 標記階段(Mark): 垃圾回收器會遍歷所有的變數,找出那些仍然被引用的物件,並將它們標記為“活的”。
  2. 清除階段(Sweep): 清除階段會釋放掉那些沒有被標記的物件,回收它們所佔用的記憶體空間。
  3. 壓縮階段(Compaction,可選): 這個階段會整理記憶體,將分散的空間合併成連續的區塊,以提高記憶體的使用效率。

Go 語言的垃圾回收機制

Go 語言使用一種稱為「非分代三色標記-清除」的垃圾回收機制。這種機制的特點是,垃圾回收的過程與程式執行是同時進行的(即併發),這樣可以減少程式執行中斷的時間。

閱讀全文 »

[Go] Go語言的基本性能分析

發表於 2024-05-03 | 分類於 Go |
字數統計: 1.5k

在現代程式開發中,性能分析是提升程式效率和可靠性的重要一環。對於 Go 語言來說,它以其卓越的性能和簡單的語法受到眾多開發者的青睞。然而,要充分發揮 Go 的性能潛力,我們需要深入了解如何進行性能分析,找出潛在的性能瓶頸並加以優化。本篇文章將介紹 Go 語言中進行性能分析的基本方法和工具,幫助你寫出高效的 Go 程式。

什麼是性能分析?

性能分析是通過各種工具和技術,測量程式在不同條件下的表現,以找出性能瓶頸並加以改善的過程。它包括兩個基本概念:Profile 和 Trace。

Profile

Profile 是性能分析中一種測量和記錄應用程式各個部分資源使用狀況的方法。它主要集中在以下方面:

  • CPU Profile: 記錄 CPU 的使用情況,分析各個函式的 CPU 耗時。
  • Memory Profile: 記錄記憶體分配和釋放的狀況,分析記憶體使用的瓶頸。
  • Block Profile: 監控 Go 的 goroutines 由於通道和互斥鎖而阻塞的情況。

透過這些 Profile,我們可以找到哪些部分的程式碼最耗時、最耗資源,並進行優化。

Trace

閱讀全文 »

[Go] 更多環境變數: GOOS, GOARCH等等

發表於 2024-04-30 | 分類於 Go |
字數統計: 1k

在使用 Go 語言開發應用程式時,環境變數扮演著關鍵的角色。它們幫助我們配置編譯器、執行環境、調試資訊等多個方面。理解這些變數的作用,可以讓我們更好地掌控 Go 開發環境,寫出更高效、更具跨平台性的程式。今天,我們就來聊聊一些重要的 Go 環境變數,比如 GOOS 和 GOARCH,以及它們在實際開發中的應用。

為什麼要了解環境變數?

首先,環境變數是一種簡單而強大的配置方式,讓我們能夠根據需要調整開發環境。例如,當你需要在 Windows 上開發,但希望你的程式碼最終執行在 Linux 伺服器上時,環境變數可以幫助你在開發過程中模擬不同的作業系統環境。

常見的 Go 環境變數

1. GOOS

  • 定義: GOOS 是用來指定目標作業系統的環境變數。
  • 可選值: 常見值有 linux、windows、darwin(對應 macOS)等等。
  • 用途: 當我們需要交叉編譯時,設定 GOOS 可以讓 Go 編譯器為指定的作業系統生成可執行檔案。
閱讀全文 »

[Go] 單元測試: 提高程式碼的質量

發表於 2024-04-23 | 分類於 Go |
字數統計: 1.2k

在程式設計的世界裡,單元測試像是你的程式碼的私人保鏢,每一個保鏢守護著各自一小區塊的程式碼,確保它不會在你不注意的時候崩潰。在這篇文章中,我們將深入探討 Go 語言的單元測試,並了解如何透過測試來提高程式碼的質量。不論你是剛接觸 Go 語言的新手,還是已經有經驗的開發者,希望你們都可以從中獲得一些實用的技巧。

什麼是單元測試?

簡單來說,單元測試就是針對程式中最小的可測試單位(通常是一個函式或方法)進行自動化測試。這就像是在驗證你的車子裡的每個零件是否正常運作(一個單元測試一般只測試一個零件),確保整台車不會在半路拋錨。

為什麼要進行單元測試?

  1. 提高程式碼質量: 單元測試可以幫助你找到程式碼中的潛在錯誤,並在開發早期就修復它們。
  2. 減少重複錯誤: 當發現錯誤並修復後,測試用例將確保這些錯誤不會再次發生。
  3. 簡化重構: 單元測試為程式碼重構提供了保障,讓你在不改變功能的情況下優化程式碼結構。
  4. 增強信心: 擁有全面的測試用例可以讓開發者對其程式碼充滿信心,特別是在進行大規模修改時。
閱讀全文 »

[Go] 模組管理: Go Moduels的管理

發表於 2024-04-14 | 分類於 Go |
字數統計: 996

在開始講解Go Modules之前,讓我們先回顧一下Go語言在模組管理上的發展歷程。Go語言從1.11版開始引入了Go Modules,這是一種新的package管理方式,用來解決之前GOPATH時代的一些痛點。Go Modules允許我們在專案中定義依賴關係,並且能夠在不同版本之間切換,這大大簡化了專案管理。

一、為什麼需要Go Modules?

1. 解決版本混亂問題

在Go Modules之前,Go的專案是基於GOPATH進行管理的。這導致一個大的問題:所有的module都放在同一個地方,很容易發生不同專案之間的版本衝突。Go Modules通過在每個專案中引入go.mod文件來指定依賴module的版本,從而避免了這個問題。

閱讀全文 »

[Cache] LRU已經落伍了,S3-FIFO更適合在大快取系統

發表於 2024-04-02 | 分類於 vsan |
字數統計: 3k

什麼是 Cache?

在我們的電腦系統中,Cache(快取)扮演著至關重要的角色。快取是一種高效能的臨時儲存區域,用於儲存經常被訪問的資料,以加速資料讀取和寫入的速度。想像一下冰箱裡的食物,快取就像是你放在冰箱門邊的零食,方便隨時取用,而不是藏在冰箱深處的冷凍食品。

一個好的 Cache 應該具備哪些特性?

  1. 高命中率: 快取的主要目的是提高資料訪問速度,所以高命中率是衡量一個好快取的關鍵指標。這就像你想從冰箱裡拿出一瓶飲料,理想情況下,它應該總是放在你容易找到的位置。
  2. 低延遲: 快取應該能夠快速響應資料請求,減少讀寫延遲。這就像你想要吃東西時,食物應該馬上能夠取到,而不是還需要解凍和加熱。
  3. 高效資源利用: 快取應該能夠高效地利用有限的儲存資源,儘可能儲存更多的有用資料。這就像冰箱空間有限,你應該放進去的是經常吃的食物,而不是占空間卻不常吃的。

當然,快取的速度很快,相對應的缺點就是「貴」!

傳統的 LRU 策略

在快取策略中,LRU(Least Recently Used)是一種經典的演算法。LRU 的基本策略是當快取空間不足時,淘汰最久未被使用的資料。這就像在冰箱裡,定期清理那些已經很久沒吃過的食物,確保新的食物有地方放。

閱讀全文 »

[Go] 更低級別的Go的變數同步技巧 - sync

發表於 2024-03-20 | 分類於 Go |
字數統計: 1.3k

Go 語言的併發模型中,一句由 Rob Pike 所提的經典名言非常關鍵:「不要透過共享記憶體來通信,而是透過通信來共享記憶體(Don’t communicate by sharing memory, share memory by communicating)」。這不僅是一句格言,更深刻地影響了 Go 語言在併發編程中的設計哲學,主要是倡導使用 channel 作為 Goroutine 之間的溝通橋樑。

儘管 Go 語言在設計上鼓勵使用通信而非共享記憶體的方法來實現併發,但它並未完全排斥傳統的基於共享記憶體的併發模型。例如,Go 的標準庫中的 sync 包就提供了多種低級的同步方法,包括互斥鎖(sync.Mutex)、讀寫鎖(sync.RWMutex)、條件變數(sync.Cond)以及原子操作等工具,這些都是在特定情況下仍然非常有用的工具。

閱讀全文 »
12…7>

68 文章
7 分類
59 標籤
© 2024 Kaichia Chen