ubuntu系統下大數據服務器磁盤調優測試記錄

一、背景

在kvm虛擬機ubuntu操作系統大數據平臺測試的過程中,遭遇了磁盤I/O性能的瓶頸,因有cpu綁核操作,故有做隔核操作驗證是否是綁核影響的磁盤I/O,后又對磁盤進行透傳以及掛內存盤等操作;

二、磁盤介紹

2.1 磁盤類型:

HDD
HDD硬盤也就是我們常常說的機械硬盤,機械硬盤是傳統的盤片+磁頭的工作原理,數據都是存儲在盤片上面,磁頭在盤片上面“做運動”來讀取和處理數據信息。

SSD
SSD由控制單元和存儲單元(FLASH芯片、DRAM芯片)組成,固態硬盤的數據讀取速度非常的快。

影響磁盤的幾個參數包含:總線、協議、接口。

2.2 總線:

SAS總線
SATA總線
PCIe總線

在這里插入圖片描述
在數據傳輸速率表現層面,我們可以簡單地理解為:PCIe4.0 > PCIe3.0 > ASTA3.0 > SAS3.0

2.3 協議:

AHCI協議
NVMe協議
SCSI協議:(不常用)
在這里插入圖片描述
在數據傳輸速率表現層面,我們可以簡單地理解為:NVMe協議傳輸速度比AHCI協議更快。

2.4 接口:

在這里插入圖片描述

2.5 磁盤陣列:

2.5.1 磁盤陣列介紹

磁盤陣列(Redundant Arrays of Independent Disks,RAID)是由很多塊獨立的磁盤組合成一個容量巨大的磁盤組,利用個別磁盤提供數據所產生加成效果提升整個磁盤系統效能。它利用這項技術,將數據切割成許多區段,分別存放在各個硬盤上。在數據重構時,可將數據經計算后重新置入新硬盤中。從用戶觀點看,磁盤陣列雖然是由幾個、幾十個甚至上百個盤組成,但仍可認為是一個單一磁盤。

2.5.2 磁盤陣列組成

Raid卡:這是實現RAID功能的核心組件,它可以劃分RAID,讓很多磁盤驅動器同時傳輸數據,而這些磁盤驅動器在邏輯上又是一個磁盤驅動器。
CPU:用于處理RAID卡上的數據和指令。
IO處理器:用于處理輸入輸出請求,將數據從磁盤讀取到緩存中,或者將數據從緩存寫入磁盤。
SCSI控制器:用于控制SCSI總線上的設備,實現設備之間的數據傳輸。
SCSI連接器:用于連接SCSI設備和主機系統。
cache:用于存儲暫時不用的數據和指令,提高系統的性能。

2.5.3 常見的Raid類型

RAID 0
RAID 1
RAID 5
RAID 6
RAID 10

2.5.4 影響磁盤陣列速度和性能的因素

磁盤陣列的設置:如果磁盤陣列沒有正確設置,可能無法實現最佳的性能。
網絡連接速度:磁盤陣列設備的速度可能受到網絡連接速度的限制。
磁盤過載:如果磁盤陣列中的磁盤過載,速度也可能會受到影響。
軟件故障:磁盤陣列設備中的軟件可能出現故障,導致性能下降。
磁盤污染:磁盤陣列中的磁盤可能受到污染,導致性能下降。
傳輸帶寬:傳輸帶寬指的是硬盤或設備在傳輸數據的時候數據流的速度,主要取決于磁盤陣列的構架、通道的大小以及磁盤的個數。

注:磁盤的性能一般使用IOPS表示

IOPS:固態硬盤的IOPS是指每秒輸入/輸出操作數,表示固態硬盤每秒可以處理多少個讀寫請求。決定IOPS的主要取決于磁盤陣列RAID類型、CACHE命中率以及磁盤個數。磁盤陣列的速度和性能可能受到多種因素的影響,包括硬件、軟件、網絡等多個方面。

三、掛載內存盤

3.1 查看虛擬機硬盤綁定情況

ps axu| grep qemu

3.2 硬盤讀寫性能測試(filename:待測試路徑 HDD硬盤隨機讀寫測試性能一般在4M/s左右)

fio -filename=/vdb_data/test_randread -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=4k -size=10G -numjobs=10 -runtime=60 -group_reporting -name=mytest

參數解釋

-filename=/vdb_data/test_randread:指定測試文件的路徑和名稱為/vdb_data/test_randread。
-direct=1:使用直接I/O模式,即跳過系統緩存,直接讀寫磁盤。
-iodepth 1:每個作業的I/O深度為1,即每個作業在隊列中只有一個I/O請求。
-thread:使用線程模式執行測試任務。
-rw=randrw:使用隨機讀寫模式進行測試,即同時進行隨機讀和隨機寫操作。
-ioengine=psync:指定使用psync I/O引擎。
-bs=4k:設置每個I/O請求的塊大小為4KB。
-size=10G:指定測試文件的大小為10GB。
-numjobs=10:指定并發作業數為10,即同時執行10個測試任務。
-runtime=60:設置測試運行時間為60秒。
-group_reporting:匯總所有作業的結果報告。
-name=mytest:指定測試任務的名稱為mytest,用于標識這個測試任務。

3.3 硬盤透傳

虛擬機磁盤透傳是指將物理主機上的磁盤直接映射給虛擬機使用,而不是通過虛擬機軟件(如VMware、VirtualBox)創建虛擬磁盤文件。這樣做可以提高性能,減少虛擬化層的開銷,適用于一些對性能要求較高的應用場景。

3.3.1 以下是在一些常見虛擬化平臺上實現磁盤透傳的步驟:

KVM/QEMU(測試的情況)
1、編輯虛擬機的XML配置文件,添加類似如下的配置:

vim /vmimages/passthough-disk.xml
<disk type='block' device='disk'><driver name='qemu' type='raw' cache='none'/><source dev='/dev/nvme4n1'/><target dev='vdd' bus='virtio'/>
</disk>

其中/dev/nvme4n1是要透傳的物理磁盤設備。

2、使用virsh工具重新加載配置文件使更改生效:

#掛載透傳硬盤
virsh attach-device vm1 /vmimages/passthough-disk.xml
#取消掛載透傳硬盤
virsh detach-device vm1 /vmimages/passthough-disk.xml# vm1是虛擬機名

VMware vSphere/ESXi
1、在ESXi主機上將物理磁盤添加到存儲適配器中。
2、在虛擬機設置中選擇添加硬件 - 存儲控制器 - 硬盤。
3、選擇“使用一個已經存在的磁盤”,然后選擇要透傳的物理磁盤。
4、完成虛擬機設置并啟動虛擬機,系統會識別并掛載透傳的物理磁盤。

Microsoft Hyper-V
1、在Hyper-V管理器中選擇目標虛擬機,右鍵點擊設置。
2、選擇添加硬件,然后選擇物理硬盤。
3、選擇要透傳給虛擬機的物理磁盤。
4、完成虛擬機設置并啟動虛擬機,系統會識別并掛載透傳的物理磁盤。

3.4 掛載內存盤

mount -t tmpfs -o size=40G tmpfs /mnt/tmp/

-t tmpfs:指定掛載的是內存盤
-o size=40G tmpfs;指定掛載內存盤大小

開機自動掛載

tmpfs /mnt/tmp/ tmpfs size=40G 0 0

內存盤讀寫性能測試(去除-direct參數,否則不能運行):

fio -filename=/mnt/tmp/test_randread -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=4k -size=2G -numjobs=1 -runtime=600 -group_reporting -name=mytest

3.5 隔核測試

1、隔核操作

sudo vim /etc/default/grub

增加以下內容

# 隔核2-79,iommu=pt,intel_iommu=on
GRUB_CMDLINE_LINUX_DEFAULT="isolcpus=2-79 iommu=pt intel_iommu=on"

在這里插入圖片描述

使改動生效

  update-grubreboot

2、指定內核測試磁盤性能

taskset -c 3(指定xx核) fio -filename=/ssd_test/test_randread -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=10G -numjobs=1 -runtime=60 -group_reporting -name=mytest

3、給予線程高權限,防止因為out of memory被宿主機kill:

ps aux | grep qemu(獲取虛擬機得進程id)echo -1000 > /proc/進程id/oom_score_adj

占用指定內存空間以達到極限測試效果的程序

def allocate_memory(size_in_gb):# 分配指定GB數的內存空間num_bytes = size_in_gb * (1024**3)  # 轉換GB到字節try:# 使用bytearray創建一個大數組big_array = bytearray(num_bytes)print(f"Successfully allocated {size_in_gb} GB of memory")return big_arrayexcept MemoryError:print(f"Failed to allocate {size_in_gb} GB of memory. Not enough resources.")if __name__ == "__main__":size = 40  # 指定想要分配的內存大小(GB)memory_block = allocate_memory(size)# 在此處加入任何想要進行的處理# ...input("Press Enter to release the allocated memory and exit the program.")

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/711634.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/711634.shtml
英文地址,請注明出處:http://en.pswp.cn/news/711634.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

『NLP學習筆記』圖解 BERT、ELMo和GPT(NLP如何破解遷移學習)

圖解 BERT、ELMo和GPT(NLP如何破解遷移學習) 文章目錄 一. 前言二. 示例-句子分類三. 模型架構3.1. 模型輸入3.2. 模型輸出四. BERT VS卷積神經網絡五. 詞嵌入新時代5.1. 簡要回顧詞嵌入Word Embedding5.2. ELMo: 上下文語境很重要5.2.1. ELMo的秘密是什么?5.3. ULM-FiT:將遷…

藍橋杯Python B組練習——斐波那契數列

一、題目 定義 斐波那契數列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又稱黃金分割數列&#xff0c;因數學家萊昂納多斐波那契&#xff08;Leonardo Fibonacci&#xff09;以兔子繁殖為例子而引入&#xff0c;故又稱為“兔子數列”&#xff0c;指的是這樣一個數…

Linux x86平臺獲取sys_call_table

文章目錄 前言一、根據call *sys_call_table來獲取二、使用dump_stack三、根據MSR_LSTAR寄存器四、使用sys_close參考資料 前言 Linux 3.10.0 – x86_64 最簡單獲取sys_call_table符號的方法&#xff1a; # cat /proc/kallsyms | grep sys_call_table ffffffff816beee0 R sy…

隨想錄算法訓練營第四十七天|198.打家劫舍、213.打家劫舍II、337.打家劫舍III

198.打家劫舍 public class Solution {public int Rob(int[] nums) {if(nums.Length0){return 0;}if(nums.Length1){return nums[0];}int[] dpnew int[nums.Length1];dp[0]nums[0];dp[1]Math.Max(nums[0],nums[1]);for(int i2;i<nums.Length;i){dp[i]Math.Max(dp[i-2]nums[…

什么是 HTTPS 證書?作用是什么?

HTTPS 證書&#xff0c;即超文本傳輸安全協議證書&#xff08;Hypertext Transfer Protocol Secure&#xff09;&#xff0c;是網站安全的關鍵組成部分。它通過 SSL/TLS 加密協議&#xff0c;確保用戶與網站之間的數據傳輸是加密和安全的。 什么是 HTTPS 證書&#xff1f; HT…

使用Docker -compose啟動自定義jar包

步驟1&#xff1a;編寫docker-compose.yml文件 首先我們需要編寫一個docker-compose.yml文件來定義我們的服務傳到我們的云服務器上 以下是一個示例&#xff1a; version: 3 services:app:build:context: .dockerfile: Dockerfileports:- 8080:8080volumes:- ./app.jar:/app…

可視化圖表:水球圖,展示百分比的神器。

Hi&#xff0c;我是貝格前端工場的老司機&#xff0c;本文分享可視化圖表設計的水球圖設計&#xff0c;歡迎老鐵持續關注我們。 一、水球圖及其作用 水球圖是一種特殊的可視化圖表&#xff0c;它主要用于展示百分比或比例的數據&#xff0c;并以水球的形式進行呈現。水球圖的作…

2023面試題

目錄 題目 1:JVM 整體結構是什么樣的? 8 題目 3:Object 類有哪些方法? 11 題目 4:靜態變量與實例變量區別? 11 題目 5:String 類的常用方法有哪些? 11 題目 6:數組有沒有 length()方法?String 有沒有 length() 12 題目 7:String、StringBuffer、StringBuilder 的區別…

【k8s 訪問控制--認證與鑒權】

1、身份認證與權限 前面我們在操作k8s的所有請求都是通過https的方式進行請求&#xff0c;通過REST協議操作我們的k8s接口&#xff0c;所以在k8s中有一套認證和鑒權的資源。 Kubenetes中提供了良好的多租戶認證管理機制&#xff0c;如RBAC、ServiceAccount還有各種策路等。通…

集合篇之ArrayList

一、源碼如何分析&#xff1f; 1.成員變量 2.構造方法 3.關鍵方法 一些添加的方法。 二、debug看源碼 我們給出下面代碼&#xff1a; public void test01() {ArrayList<Integer> list new ArrayList<>();list.add(1);for (int i 2; i < 10; i) {list.add(i…

H5:段落標簽與換行標簽

目錄 一.前言 二.正文 1.段落標簽 2.換行標簽 三.結語 一.前言 學習前端&#xff0c;從此起飛&#xff0c;愿你堅持&#xff0c;直至等頂。 二.正文 1.段落標簽 <p></p> p為段落標簽&#xff0c;由英文paragraph簡寫而來&#xff0c;用于將一段某一部分文本&am…

算法練習第九天|232.用棧實現隊列、225. 用隊列實現棧

熟悉棧和隊列的方法&#xff1b;熟悉棧和隊列的數據結構&#xff0c;不涉及算法 232.用棧實現隊列 import java.util.Stack; class MyQueue {//負責進棧的Stack<Integer> stackIn;//負責出棧的Stack<Integer> stackOut;public MyQueue() {stackIn new Stack<&…

Rocketmq 入門介紹

從零手寫實現 mq 詳細介紹一下 rocketmq RocketMQ 是由阿里巴巴開發的分布式消息隊列系統&#xff0c;它是一個低延遲、高可靠、高吞吐量的消息中間件。 RocketMQ 最初是作為阿里巴巴的內部項目進行開發的&#xff0c;后來成為了 Apache 軟件基金會下的頂級項目&#xff0c;以…

精讀《React 高階組件》

本期精讀文章是&#xff1a;React Higher Order Components in depth 1 引言 高階組件&#xff08; higher-order component &#xff0c;HOC &#xff09;是 React 中復用組件邏輯的一種進階技巧。它本身并不是 React 的 API&#xff0c;而是一種 React 組件的設計理念&…

【QT+QGIS跨平臺編譯】之五十三:【QGIS_CORE跨平臺編譯】—【qgssqlstatementparser.cpp生成】

文章目錄 一、Bison二、生成來源三、構建過程一、Bison GNU Bison 是一個通用的解析器生成器,它可以將注釋的無上下文語法轉換為使用 LALR (1) 解析表的確定性 LR 或廣義 LR (GLR) 解析器。Bison 還可以生成 IELR (1) 或規范 LR (1) 解析表。一旦您熟練使用 Bison,您可以使用…

transformers文本相似度

在自然語言處理(NLP)中,文本相似度是衡量兩個文本之間語義或結構相似程度的一個重要概念。計算文本相似度的方法多種多樣,適應不同的應用場景和需求。以下是一些常見的文本相似度計算方法: 1、余弦相似度: 通過將文本轉換為向量表示(例如,使用詞袋模型、TF-IDF 或 wor…

2024年個人護理賽道選品風向在哪?這份賽盈分銷選品攻略必看!

2024年還會卷下去嗎&#xff1f;看到一位行業大佬分享的內容深有感觸&#xff1a;堅定做好產品&#xff0c;不做大賣&#xff0c;就不存在卷不卷。 有人出局&#xff0c;也會有人入局&#xff0c;并且深耕領域做大做強。 專注口腔護理的Bitvae入行不到兩年&#xff0c;憑借一款…

C#學習(十四)——垃圾回收、析構與IDisposable

一、何為GC 數據是存儲在內存中的&#xff0c;而內存又分為Stack棧內存和Heap堆內存 Stack棧內存Heap堆內存速度快、效率高結構復雜類型、大小有限制對象只能保存簡單的數據引用數據類型基礎數據類型、值類型- 舉個例子 var c new Customer{id: 123,name: "Jack"…

Java中String類有哪些常用方法?

Java中的String類提供了許多有用的方法&#xff0c;用于處理字符串。以下是一些常用的方法及其簡要描述&#xff1a; 1. **charAt(int index)**&#xff1a;返回指定位置的字符。 2. **length()**&#xff1a;返回字符串的長度。 3. **substring(int beginIndex, int endInd…

微信小程序手勢沖突?不存在的!

原生的應用經常會有頁面嵌套列表&#xff0c;滾動列表能夠改變列表大小&#xff0c;然后還能支持列表內下拉刷新等功能。看了很多的小程序好像都沒有這個功能&#xff0c;難道這個算是原生獨享的嗎&#xff0c;難道是由于手勢沖突無法實現嗎&#xff0c;冷靜的思考了一下&#…