Sunday, February 6, 2022

[Golang] Pointer Performance 指標傳遞性能

Pointer Performance 

我在O`REILLY出的一本書 "Go學習手冊"內有看到一個很有趣的段落: 指標傳遞性能 ( Pointer Performance )

我把這段的重點直接整理下來(因為很重要) 如下:

  • 無論資料的大小為何,將指標傳入函式的時間都是固定的,大約是1 nanosecond。
  • 如果struct夠大,將struct的指標當成輸入參數或是回傳值可以改善性能
  • 回傳指標 vs. 回傳值的行為比較有意思。如果資料結構小於1MB,回傳指標型別其實比回傳值更慢。例如: 100-byte的資料結構大約要花10 nanosecond 來回傳,但是那個資料結構的指標大約要花30 nanosecond。當資料結構超過1MB,性能優勢就會逆轉,回傳10MB的資料大約要花2 millisecond,但是回傳它的指標大約是0.5millisecond再多一些。

Thursday, February 3, 2022

[Fun] 重溫DoS時期的遊戲: 殖民帝國 Colonization

重溫DoS時期的遊戲: 殖民帝國 Colonization

這套遊戲盒裝內的說明書、磁碟片(3 1/2吋)等等的相關的東西都有很完整保存下來,不信的話請看下圖:



由於這遊戲是執行在DoS 作業系統上的,所以我們需要在Windows 10上安裝DOS模擬器,並用此模擬器玩遊戲,執行步驟如下:

[用Golang寫小遊戲教學] 第八章 指標

 [前言]

指標語法在C/C++程式語言中是非常重要的用法與功能,它可以讓程式更快速且更高效。Golang保有了指標語法,之後的章節在寫小遊戲時也會用到,所以我們需要了解如何正確地使用它。

[指標快速入手]

透過變數宣告時,需要在型別前面加上 *號,代表是指標型態,用來告訴編譯器這變數是某種型別的指標變數

給值時也要給值的位置,我們在值前面加上 & 符號(位址運算子)。請看下面例子:

Tuesday, February 1, 2022

[Kubernetes] 如何把 Master Node 改成有 Worker的屬性 (可分配Pods)

使用命令 kubectl taint 可以給節點(Node)增加一個污點。

比如:

kubectl taint nodes node1 key1=value1:NoSchedule

說明: 

給節點 node1 增加一個污點,它的鍵名是 key1,鍵值是 value1,效果是 NoSchedule。這表示只有擁有和這個污點相匹配的容忍度的 Pod 才能夠被分配到 node1 這個節點。

若要移除上述命令所添加的污點,你可以執行:

kubectl taint nodes node1 key1=value1:NoSchedule-

最常用的例子就是把 Master Node 改成有 Worker的屬性

kubectl taint nodes k8s1 node-role.kubernetes.io/master:NoSchedule-


[更新]

在K8S v1.24之後默認kubeadm取消taint,之前版本使用node-role.kubernetes.io/master標籤,在Kubernetes 1.24版本中,label標籤已經修改為node-role.kubernetes.io/control-plane

查看node節點所有標籤

kubectl get nodes --show-labels

我們可以直接查看master節點污點情況

kubectl describe node <node_name> | grep Taints

生成污點

kubectl taint nodes <node_name> node-role.kubernetes.io/control-plane:NoSchedule

取消污點

kubectl taint nodes <node_name> node-role.kubernetes.io/control-plane:NoSchedule-


Reference: 

kubectl 備忘單

https://kubernetes.io/zh/docs/reference/kubectl/cheatsheet/


[Kubernetes] How to use Informer to avoid frequently getting Pod and Service List via clientset.CoreV1()?

How to use Informer to avoid frequently getting Pod and Service List via clientset.CoreV1()?

 [情境]

之前開發Kubernetes相關的系統有遇過這種情況: 

需要不斷的輪詢(Pooling) Kubernetes API 去獲得最新的 Pods 與 Services List,例如是每2秒。但輪詢是比較沒有效率的做法,因為很有極大的可能是,大部分的輪詢結果都是沒有變化的。

 [解決方法]

使用Informer來解決此問題。