基於 CPU 功耗來進行 PVE 虛擬機的 Live Migrations | PVE 系列-2
前言上一篇文章中我們介紹了如何在 Proxmox VE 中對虛擬機進行 Live Migrations,現在我們要加入條件來去對虛擬機進行 Migrations,由於我目前需求會是功耗,因此會需要知道在如何獲取 CPU 功耗的資訊。 獲取 CPU 功耗資訊通常可以透過幾種方式來獲取 CPU 或者是其他硬體的功耗,最簡單的方式就是透過 powerstat 來在 Linux/Unix 環境中查看 CPU 的功耗。 另外如果主機有 BMC和支援IPMI 的話,那就可以透過 ipmitool 去獲取主機的電力消耗資訊。 題外話: 其實 Proxmox VE 本身是有支援 IPMI watchdog 的,可以在 /etc/default/pve-ha-manager 裡面去取消註解,改成使用 IPMI watchdog,因為默認是使用作業系統層級的 softdog,但如果主機板沒有支援的話那就還是用默認的就好。 這邊提供幾行指令檢測你的主機有沒有支援 IPMIsudo apt-get install ipmitool檢查 BMC (Board Management Cont...
填充每個節點的右側指標 II| Medium | LeetCode#117. Populating Next Right Pointers in Each Node II
題目敘述 題目難度:Medium 題目敘述: 題目會給 Binary Tree 的節點,節點結構如下,除了 *left, *right pointer 之外,還多了一個 *next 指標,用於指向該層中右方的節點,而如果右方節點不存在,則 *next 指向 NULL 123456struct Node { int val; Node *left; Node *right; Node *next;} 上圖中的例子中,題目會依序給 Binary Tree 的節點 [1,2,3,4,5,null,7] 而輸出結果也如圖,節點 1 沒有右邊節點,所以它的 *next 指向 NULL。再來就是下一層,節點 2 的下一個是節點 3,而節點 3 沒有右邊節點,所以會是指向 NULL 123(1) -> NULL(2) -> (3) -> NULL(4) -> (5) -> (7) -> NULL 解法一開始的想法看到這個題目的第一想法就是 BFS,因為題目要求要找右邊節點,而這個操作都會在相同 level 去做,因此我在想...
實作 Proxmox VE VM 的 Live Migrations | PVE 系列-1
Proxmox VE 介紹Proxmox VE(PVE) 是一個開源的虛擬化環境,能夠同時支援基於 LXC (Linux Container) 的容器,抑或是基於Kernel 的VM,即為 KVM,也就是將 Linux Kernel 作為 Hypervisor 的虛擬化技術。 而 Proxmox 也透過介於 Host 與 Guest 的 QEMU 去處理 Guest 的硬體請求,將其轉譯給真正的硬體,搭配KVM 一起運作可帶來指令處理效能上的提升。因此可以以近乎本地環境的速度來去進行虛擬化。 實體節點設定Proxmox VE images 燒錄 這裡準備好 USB 將 Proxmox VE 的 iso image 放置其中,我選擇 Proxmox VE 7.4 ISO Installer PVE Image 官網下載處 接著就是要準備節點,並且在個別主機上調整開機順序,進到 BIOS 後將 USB 調整成第一順位,接著可以順便檢查一下BIOS 中的 KVM 有沒有 Enable,一定要先去 Enable。我的環境下,可在 BIOS 設定中的 Advanced 中找...
二元樹的最近共同祖先 | Medium | LeetCode#236. Lowest Common Ancestor of a Binary Tree
題目敘述 題目難度: Medium 題目敘述: 給定一個 binary tree,請找到任兩節點 p 和 q 的 lowest common ancestor (LCA) 最近公同祖先(lowest common ancestor): 是指在節點 p 和 q 之間,二元樹 T 中最低的、同時擁有 p 和 q 作為後代的節點 (本題允許當前節點是自己的後代) 解法一開始的想法想法一樣會是 DFS,因為在正常實踐 DFS 的過程中,我們是透過遞迴函式呼叫來實現,Ancestor 一定會是 descendant 的 caller之一。因此朝著 DFS方向去想。另外沒必要把 Traversal全部跑完,只要能夠找到 p 與 q 即可。 我的解法123456789101112131415161718192021222324/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * ...
從 Inorder 和 Postorder Traversal 建構二元樹 | Medium | LeetCode#106. Construct Binary Tree from Inorder and Postorder Traversal
題目敘述 題目難度: Medium 題目敘述: 給定兩個整數 inorder 和 postorder 分別代表對一個 binary tree 進行 inorder traversal 和 postorder traversal 的結果,請建構一棵二元樹,並回傳二元樹的 root。 解法一開始的想法這題算是 LeetCode 105 的延伸題目。 其實有想法很像: Inorder 的第一個元素是 leftmost 元素 Preorder 的最後一個元素會是 root 因此每次迭代過程中,透過 postorder 中找到的 root 節點值,來去找到 inorder 中的 subTree 該怎麼切分左右子樹 我的解法1234567891011121314151617181920212223242526272829303132333435363738/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * ...
BST 中第K小的元素 | Medium | LeetCode#230. Kth Smallest Element in a BST
題目敘述 題目難度:Medium 題目敘述:給定一個 Binary Search Tree 的 root,以及一個整數 k ,回傳第 $k^{th}$ 小的節點值 解法 這題是刷題到目前下來解最快的一題,從打開題目到最後 Accept 大概花 15 分鐘,其中包含 5 分鐘在local端手動寫測試 一開始的想法題目要求回傳 第 K 個最小的節點值,所以想法很簡單,首先 BST 的由左至右的大小排序跟你對樹進行 In-Order Traversal 的順序會一致,因此當你進行 In-Order Traversal 第一個拜訪的節點就會是最小值,接著拜訪到的就是 BST 中第二小的節點,依序下去…。 因此只要透過一個 counter 來計算現在是否第K個節點就好,如果找到就回傳節點值。 我的解法123456789101112131415161718192021222324252627282930/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNo...
二元樹Z字形走訪 | Medium | LeetCode#103. Binary Tree Zigzag Level Order Traversal
題目敘述 題目難度:Medium 題目敘述:給定一個二元樹的 root ,回傳對這棵樹進行 Z 字走訪 (Zigzag Level Order Traversal)的結果 Zigzag Level Order Traversal 代表先從左走到右,下一層再從右走到左,每一層走訪方向交互替換 解法一開始的想法這題想法也很直觀,就BFS,然後宣告一個用來存放結果的 2D Vector,透過變數控制在每一層走訪的時候,按照順序或反向順序放入 vector 當中。 我的解法123456789101112131415161718192021222324252627282930313233343536373839/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {...
Valid 的二元搜尋樹 | Medium| LeetCode#98. Validate Binary Search Tree
題目敘述 題目難度: Medium 題目敘述: 題目給定一個 Binary Tree 的 root ,我們需要確認這棵 Binary Tree 是否是 Binary Search Tree 一個 valid 的 Binary Search Tree(BST) 包含了: 對於任意節點,其 Left SubTree 的任意節點值一定小於當前節點值 對於任意節點,其節點值一定小於其 Right SubTree 的任意節點值 Left SubTree 和 Right SubTree 都要是 binary search tree 解法一開始的想法這題想法很簡單,這題的花費時間很少,首先可以知道的是: BST 從小到大走訪,其走訪順序會是對同一棵樹進行 inorder traversal。 所以只要能夠 在 Inorder 走訪過程中比較前一個節點值與當前節點值,看前一個節點是否比當前節點小即可 我的解法1234567891011121314151617181920212223242526272829/** * Definition for a binary tree node...
在 C/C++ 中傳遞函式- 深入 Function Pointer 的記憶體位址變化
函式指標 (Function Pointer) 當你透過 C/C++ 中宣告一個函式時,就會分配一段起始記憶體位址,而 Function Pointer 就可以用來指向以及儲存函式位址。 所以我們可以直接透過 Function Pointer 1.來呼叫一個函式 2.或者將它傳遞給其他函式 用法宣告: 1[回傳值的data type] (* function pointer name)(input parameter1, input parameter2, ...); 記得需要將函數的位址 assign 給 function pointer,可以透過取位址運算子 & 來進行,這裡看下方範例: 1234567891011121314#include <iostream>using namespace std;int add(int a, int b){ return a+b;}int main() { int (*func_ptr)(int,int); int result; func_ptr = &...
BST 中的最小節點差值 | Easy| LeetCode#530. Minimum Absolute Difference in BST
題目敘述 題目難度: Easy 題目敘述: 給定一個 Binary Search Tree (BST) 的 root ,回傳樹中任意兩個節點的絕對值當中最小的。 解法一開始的想法首先 Binary Search Tree 的特性就是對於任意節點, 其左子樹必定 < 當前節點 < 右子樹。 因此可以判斷,在對這顆樹進行 Inorder Traversal 的過程中,相鄰節點的差值會是最小的,不存在跨一個節點之間差值更小的問題 所以基本上我的想法就是跑一遍 Inorder Traversal,將節點記錄到一個 list,在 list 中再計算差值.但這樣缺點就是 runtime 會增加。 我的解法123456789101112131415161718192021222324252627282930313233343536/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right;...













