tft每日頭條

 > 生活

 > linux性能優化之從cpu開始

linux性能優化之從cpu開始

生活 更新时间:2024-09-05 16:15:21

linux性能優化之從cpu開始?無論我們從事的是測試工作、開發工作或者運維工作,當性能測試或線上出現性能問題時,相信很多人都會用到的一個命令就是top,通過top首先關注的就是CPU指标,接下來Linux篇我們就先從CPU開始,下面我們就來說一說關于linux性能優化之從cpu開始?我們一起去了解并探讨一下這個問題吧!

linux性能優化之從cpu開始(Linux篇:1CPU之基礎知識)1

linux性能優化之從cpu開始

無論我們從事的是測試工作、開發工作或者運維工作,當性能測試或線上出現性能問題時,相信很多人都會用到的一個命令就是top,通過top首先關注的就是CPU指标,接下來Linux篇我們就先從CPU開始。

在講解CPU使用率、CPU負載、上下文切換等CPU知識之前,我們先問自己一個問題:CPU的單位是什麼?

相信很多人都有點模糊,有人說了,單位肯定是“個”啊,單核CPU、多核CPU,那我們常聽到的CPU多少赫茲(HZ)又是啥呢?對CPU資源做過限制的同學可能又看到過:CPU限制500m,這個m又是什麼呢?

帶着這幾個問題,下面我們一點點尋找答案。

首先,我們必須要有一個基本的共識,那就是在任意一個時刻,一個CPU隻能處理一個“任務”。這個“任務”是什麼呢?我們在學校上課時可能聽到過這麼一句話,線程是CPU調度的基本單位,那麼在這裡提到的“任務”就是一個線程。此處我們假設一個任務就包括了一個線程,比如這個任務是看電影、搜索網頁、微信聊天。如果我的電腦隻有一個CPU,也就是單核CPU,按照一個CPU隻能處理一個任務的邏輯,那我隻能做一件事,要麼看電影,要麼聊天,看完電影後才能聊微信。這樣肯定是不行的,也不符合我們玩電腦的常識,顯然我們看電影的同時也是可以聊天的,那麼CPU是怎麼做到的呢?

這就引出了時間分片概念,其實所謂的CPU調度,也就是擁有時間分片。内核在微觀上,會把CPU的運行時間分成許多份,然後為每個線程分配時間額度,安排給各個線程輪流運行,如果當前線程的時間額度用完了,就會被強制停止(不考慮優先級等機制的情況下),切換其他線程執行。這就造成宏觀上所有的任務(線程)仿佛同時在執行的錯覺。

在Linux的内核處理過程中,每一個進程默認會有一個固定的時間片來執行命令,這段時間内進程被分配到CPU,然後獨占使用。如果使用完,同時未到時間片的規定時間,那麼就主動放棄CPU的占用,如果到時間片用完尚未完成工作,那麼CPU的使用權也會被收回,進程将會被中斷挂起等待下一個時間片。

時間片的長短對系統性能是很關鍵的:它既不能太長也不能太短。

如果平均時間片太短,由進程切換引起的系統額外開銷就變得非常高。例如,假定進程切換需要5ms,如果時間片也設置5ms,那麼cpu至少把50%的時間花費在進程切換上。

如果平均分片太長,進程看起來就不再是并發執行。例如,讓我們假定把時間片設置為5s,那麼,每個可運行進程運行大約5s,但是暫停的時間更長(一般是5s乘以可運行進程的個數)。

對時間片大小的選擇始終是一種折中。Linux采取單憑經驗的方法,即選擇盡可能長、同時能保持良好相應時間的一個分片。

——《深入理解Linux内核》

知道了時間分片的概念,我們接下來再看赫茲(HZ)。HZ是系統時鐘在一秒内固定發出時鐘中斷的次數。HZ在編譯内核前是可以進行配置的,因此通過下述命令就可以查看當前系統的時鐘中斷頻率:

cat /boot/config-`uname -r` | grep CONFIG_HZ

CONFIG_HZ_PERIODIC=y

# CONFIG_HZ_100 is not set

# CONFIG_HZ_250 is not set

# CONFIG_HZ_300 is not set

CONFIG_HZ_1000=y

CONFIG_HZ=1000

從上面的展示可以看出,我開發機的時鐘中斷頻率是1000HZ。時鐘中斷是操作系統最重要的中斷,操作系統内核依靠時鐘中斷完成時間片計算和分配、定時等管理工作,是分時機制實現的基礎,總之時鐘中斷主要處理和時間有關的所有信息,這些信息包括系統時間、進程的時間片、延時、使用CPU的時間、各種定時器等等。

和時鐘中斷緊密相連的一個概念就是tick,也叫“滴答”,tick是系統時鐘每“滴答”一次的時間,其值為(1/HZ)秒。也就是連續兩次時鐘中斷之間的時間間隔。

内核中有個全局變量jiffies,用來計算自系統啟動以來tick的次數,也就是說系統時鐘每産生一次時鐘中斷,該變量的值就增加一次。後面的文章我會講到CPU使用率也是以tick為基礎進行計算的。

cat /proc/sched_debug|grep jiffies

jiffies : 10490243173

最後一個問題,我們在很多資源限制的定義中經常見到CPU限制xxxm的描述,比如下面是kubernets使用中一個yaml文件定義一個資源的限制時的描述:

resources:

requests:

memory: "64Mi"

cpu: "250m"

limits:

memory: "128Mi"

cpu: "500m"

其實此處CPU 資源的單位是 millicores,即一個核的 1/1000,那500m就是0.5個core的意思。它等價于下面的描述

resources:

requests:

memory: "64Mi"

cpu: "0.25"

limits:

memory: "128Mi"

cpu: "0.5"

可能又有人問了,0.5個cpu是隻使用半個cpu嗎,答案是對也不對。對是因為确實是使用了半個cpu,不對是因為這個一半不是物理意義上的半個CPU,而是邏輯上的一半,也就是限制了程序隻能使用一個CPU時間的一半時間片。

總結:通過以上概念的分析,從整體上你應該對cpu有了一個大概的認識。如果有人再問CPU的單位是什麼,不能籠統的說是“個”或者“赫茲”,要結合問這個問題的場景進行回答。其實CPU的工作是一個特别複雜的過程,中斷處理、工作隊列、CPU競争、進程調度等等,在内核中是一個很龐大的工程,但是隻要能夠理解即将講解的内容就能應付工作中80%的問題,更深入的知識有機會會不斷補充。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved