A. 資料庫消耗內存大還是cpu大
作者 王文安,騰訊CSIG資料庫專項的資料庫工程師,主要負責騰訊雲資料庫 MySQL 的相關的工作,熱愛技術,歡迎留言進行交流。文章首發於騰訊雲+社區的騰訊雲資料庫專家服務專欄。
在日常工作中,發現 MySQL 的狀態不太對勁的時候,一般都會看看監控指標,很多時候會看到熟悉的一幕:CPU 使用率又爆了。本文將給大家介紹 MySQL 和 CPU 之間的關系,對此有一定的了解之後可以更准確的判斷出問題的原因,也能夠提前發現一些引發 CPU 問題的隱患。
怎麼看懂CPU使用率
以 Linux 的 top 命令為例,效果如下:
Top 命令
在 %CPU 這一列就展示了 CPU 的使用情況,百分比指代的是總體上佔用的時間百分比:
%us:表示用戶進程的 CPU 使用時間(沒有通過 nice 調度)
%sy:表示系統進程的 CPU 使用時間,主要是內核使用。
%ni:表示用戶進程中,通過 CPU 調度(nice)過的使用時間。
%id:空閑的 CPU 時間
%wa:CPU 運行時在等待 IO 的時間
%hi:CPU 處理硬中斷花費的時間
%si:CPU 處理軟中斷花費的時間
%st:被虛擬機偷走的 CPU 時間
通常情況下,我們討論的 CPU 使用率過高,指的是 %us 這個指標,監控裡面的 CPU 使用率通常也是這個值(也有用其他的方法計算出來的,不過簡單起見,不考慮其他的情況 )。其他幾個指標過高也代表出 MySQL 的狀態異常,簡單起見,這里主要還是指 %us 過高的場景。
MySQL和線程
MySQL 是單進程多線程的結構,意味著獨占的 MySQL 伺服器裡面,只能用 top 命令看到一行數據。
TOP 命令效果
這里能看到的是 MySQL 的進程 ID,如果要看到線程的情況,需要用top -H
TOP 命令效果
在這里能看到的是 MySQL 各個線程的 ID,可以看到 MySQL 在啟動之後,會創建非常多的內部線程來工作。
這些內部線程包括 MySQL 自己用來刷臟,讀寫數據等操作的系統線程,也包括處理用戶 SQL 的線程,姑且叫做用戶線程吧。用戶線程有一個特殊的地方:程序端發送到 MySQL 端的 SQL,只會由一個用戶線程來執行(one-thread-per-connection),所以 MySQL 在處理復雜查詢的時候,會出現「一核有難,多核圍觀」的尷尬現象。
參考 %us 的定義,對於 Linux 系統來說,MySQL 進程和它啟動的所有線程都不算內核進程,因此 MySQL 的系統線程和用戶線程在繁忙的時候,都會體現在 CPU 使用率的 %us 指標上。
什麼時候CPU會100%
MySQL 干什麼的時候,CPU 會 100%?從前文的分析來看,MySQL 主要是兩類線程佔用 CPU:系統線程和用戶線程。因此 MySQL 獨占的伺服器上,只需要留意一下這兩類線程的情況,就能 Cover 住絕大部分的問題場景。
系統線程
在實際的環境中,系統線程遇到問題的情況會比較少,一般來說,多個系統線程很少會同時跑滿,只要伺服器的可用核心數大於等於 4 的話,一般也不會遇到 CPU 100%,當然有一些 bug 可能會有影響,比如這個:
MySQL BUG
雖然情況比較少,但是在面對問題的常規排查過程中,系統線程的問題也是需要關注的。
用戶線程
提到用戶線程繁忙,很多時候肯定會第一時間憑經驗想到慢查詢。確實 90% 以上的時候都是「慢查詢」引起的,不過作為方法論,還是要根據分析再去得出結論的~
參考 us% 的定義,是指用戶線程佔用 CPU 的時間多少,這代表著用戶線程佔用了大量的時間。
一方面是在進行長時間的計算,例如:order by,group by,臨時表,join 等。這一類問題可能是查詢效率不高,導致單個 SQL 語句長時間佔用 CPU 時間,也有可能是單純的數據量比較多,導致計算量巨大。另一方面是單純的 QPS 壓力高,所以 CPU 的時間被用滿了,比如 4 核的伺服器用來支撐芹神 20k 到 30k 的點查詢,每個 SQL 佔用的 CPU 時間並不多,但是因為整體的 QPS 很高,所以 CPU 的時間被占滿了。
問題的定位
分析完之後,就要開始實戰了,這里根據前文的分析給出一些經典的 CPU 100% 場嫌源虧景,並給出簡要的定位方法作為參考。
PS:系裂敏統線程的 bug 的場景 skip,以後有機會再作為詳細的案例來分析。
慢查詢
在 CPU 100% 這個問題已經發生之後,真實的慢查詢和因為 CPU 100% 導致被影響的普通查詢會混在一起,難以直觀的看 processlist 或者 slowlog 來發現尊敬的大船,這時候就需要一些比較明確的特徵來進行甄別。
從前文的簡單分析可以看出來,查詢效率不高的慢查詢通常有以下幾種情況:
全表掃描:Handler_read_rnd_next 這個值會大幅度突增,且這一類查詢在 slowlog 中 row_examined 的值也會非常高。
索引效率不高,索引選錯了:Handler_read_next 這個值會大幅度的突增,不過要注意這種情況也有可能是業務量突增引起的,需要結合 QPS/TPS 一起看。這一類查詢在 slowlog 中找起來會比較麻煩,row_examined 的值一般在故障前後會有比較明顯的不同,或者是不合理的偏高。
比如數據傾斜的場景,一個小范圍的 range 查詢在某個特定的范圍內 row_examined 非常高,而其他的范圍時 row_examined 比較低,那麼就可能是這個索引效率不高。
排序比較多:order by,group by 這一類查詢通常不太好從 Handler 的指標直接判斷,如果沒有索引或者索引不好,導致排序操作沒有消除的話,那麼在 processlist 和 slowlog 通常能看到這一類查詢語句出現的比較多。
當然,不想詳細的分析 MySQL 指標或者是情況比較緊急的話,可以直接在 slowlog 裡面用 rows_sent 和 row_examined 做個簡單的除法,比如 row_examined/rows_sent > 1000 的都可以拿出來作為「嫌疑人」處理。這類問題一般在索引方面做好優化就能解決。
PS:1000 只是個經驗值,具體要根據實際業務情況來定。
計算量大
這一類問題通常是因為數據量比較大,即使索引沒什麼問題,執行計劃也 OK,也會導致 CPU 100%,而且結合 MySQL one-thread-per-connection 的特性,並不需要太多的並發就能把 CPU 使用率跑滿。這一類查詢其實是是比較好查的,因為執行時間一般會比較久,在 processlist 裡面就會非常顯眼,反而是 slowlog 裡面可能找不到,因為沒有執行完的語句是不會記錄的。
這一類問題一般來說有三種比較常規的解決方案:
讀寫分離,把這一類查詢放到平時業務不怎麼用的只讀從庫去。
在程序段拆分 SQL,把單個大查詢拆分成多個小查詢。
使用 HBASE,Spark 等 OLAP 的方案來支持。
高 QPS
這一類問題單純的就是硬體資源的瓶頸,不論是 row_examined/rows_sent 的比值,還是 SQL 的索引、執行計劃,或者是 SQL 的計算量都不會有什麼明顯問題,只是 QPS 指標會比較高,而且 processlist 裡面可能什麼內容都看不到,例如:
processlist
總結
實際上 CPU 100% 的問題其實不僅僅是單純的 %us,還會有 %io,%sys 等,這些會涉及到 MySQL 與 Linux 相關聯的一部分內容,展開來就會比較多了。本文僅從 %us 出發嘗試梳理一下排查&定位的思路和方法,在分析 %io,%sys 等方面的問題時,也可以用類似的思路,從這些指標的意義開始,結合 MySQL 的一些特性或者特點,逐步理清楚表象背後的原因。
B. 伺服器的CPU和內存, 哪個重要
把CPU減一個吧,應為你們數據量不算密集,甚至你們可以兩個都削減來增加在硬碟上得投資,硬碟好很重要
C. cpu和內存哪個重要
總的來說CPU更重要,內存只要上了4G基本沒有太大問題,肢判如CPU檔次就很多了,不同的需求需要不同檔次的CPU,價格也差的歷啟很多,從沖凱200塊到20000塊都有
D. 到底是CPU重要還是內存重要
這么比較不成喚配汪立呀,因為這是兩種配件,運行機制不一樣。CPU是核心運算功能,內存是傳輸數據功能,內存夠大,CPU運算不過來也不行,CPU運算快,內存小數據傳輸慢也不行,兩個是相輔相成的關系,任何一個配件是短板都會造成電腦卡、慢,所以談不上哪個重要不重和仔要,兩者同樣重要。賣冊
E. 按伺服器來說 內存 CPU 帶寬 哪個重要
問題太籠統了,伺服器要看你的使用場景。如果你用伺服器去做一個下載站或者圖片站、視頻站等對網路資源要求比較大的場景,內存和CPU都不重要,帶寬是最重要的。
如果你用伺服器裡面運行著大量使用多線程或者多進程的項目,那內存和帶寬又變的不重要了。
如果你伺服器掛載站點需要經常讀寫資料庫,網站訪問並發很大需要加裝Redis等緩存器,那麼內存變的非常重要,其次是帶寬,最後是CPU。
所以說的這么多,哪個重要還是需要看你用這個伺服器的主要使用場景
F. 資料庫吃內存還是cpu
資料庫吃內存。根據查詢相關資料信息顯示,在讀取慎棚效率上,從內存中讀取數據肯灶畢定比從硬碟中讀取數據要快。從寫入效率上來看,當內存比較大隱孝芹的時候,我們需要往硬碟中寫數據的時候,就不用每次都寫,可以先緩存著,攢夠了再一次性寫入(延緩寫入)。
G. 內存和CPU哪個更重要
CPU相對來說比內存稍微重要一些,畢竟CPU的計算能力是軟體運行的保證,內存不夠的話可以用虛擬內存來彌補,雖然效率要慢一些
H. 電腦的CPU重要還是內存重要
當然是CPU重要,CPU也叫中央處理器,是電腦的最核心配件,類似人的大腦。
下面我來普及下這兩個配件的基本知識:
1. CPU: 中央處理器(CPU),是電子計算機的主要設備之一,電腦中的核心配件。其功能主要是解釋計算機指令以及處理計算機軟體中的數據。CPU是計算機中負責讀取指令,對指令解碼並執行指令的核心部件。在計算機體系結構中,CPU 是對計算機的所有硬體資源(如存儲器、輸入輸出單元) 進行控制調配、執行通用運算的核心硬體單元。CPU 是計算機的運算和控制核心。計算機系統中所有軟體層的操作,最終都將通過指令集映射為CPU的操作。可以說,CPU甚稱人體大腦功能,你就知道他的重要性。
2. 內存: 隨機存取存儲器(英語:Random Access Memory,縮寫:RAM),俗稱內存,內存條。是與CPU直接交換數據的內部存儲器。它可以隨時讀寫(刷新時除外),而且速度很快,通常作為操作系統或其他正在運行中的程序的臨時數據存儲介質。RAM(內存)工作時可以隨時從任何一個指定的地址寫入(存入)或讀出(取出)信息。它與ROM(硬碟)的最大區別是數據的易失性,即一旦斷電所存儲的數據將隨之丟失。內存的大小,對性能有影響,但重要性與CPU比,還是其次。
總之,電腦對性能影響的最重要配件是CPU,其次顯卡,其次內存,其次硬碟,最後其它。
兩個都屬於必不可少的配件,這兩個小東西都必不可少。
CPU作為整台電襲友腦的中心,無疑更為重要,她主要提供了處理指令,執行操作,控制時間,拍租槐處理數據等功能。可以說一台電腦的性能主要由CPU提供。
也可以說CPU決定了一台電腦的上限型敗
現在很多人往往過分注重CPU的高低往往忽略了內存的大小。
見過不少朋友的電腦往往都是I7-9900K之類的CPU搭配了一個8G的內存。
而內存決定了電腦的下限。
再高配置的電腦卻搭配了一根巨小的內存,唯一結果就是電腦的運行會非常緩慢。
內存可以理解為一個淳樸與硬碟交換數據的中轉站。如果內存太小就會導致程序載入非常緩慢,如現在Windows10操作系統只給安裝4G內存的話,系統就佔用60%以上的內存,開個Excel 開幾個網頁,基本就到內存的天花板了。當內存佔用率超過95%這基本就沒法使用了。
所以CPU 內存的關系中 內存更像是木桶理論里最短的那塊木板。
所以盡量讓自己電腦的內存不要變成最短的那塊木板吧
cpu:就是中央處理器、相當於人的大腦、用來思考運算和處理問題的。
內存:就像是把剛剛看到、聽到的東西,臨時緩沖在內存、過一會兒可能就忘了,比如說復制文件到硬碟,其實不是直接到硬碟,而是經過內存---處理器---內存再到硬碟,所以復制數據的速度在某種意義上來說取決於內存。通常是CPU更重要,就好像你原來用的4代i3加8G內存,你再加一根8G內存上去,感覺沒什麼明顯升級效果。而你把CPU換成新的10代i3再加8G內存,會明顯感覺到升級後的效果。
完成一件事情,需要很多步驟,而cpu參與每一個步驟的策劃,內存收到cpu指令後執行這些步驟,所以,都很重要!
請問你覺得手重要還是腳重要?
同為電腦必備硬體,一樣重要
都重要。
I. 做數據分析到底是CPU重要還是內存重要,硬碟是PCL-E
多開文件、後台載入等對內存需求比較大。
處理速度、調用速度跟CPU和硬碟關系比較密切。
家用電腦,同樣配置,機械硬碟跟仿型固態硬碟上網睜肢都有明顯區別(隨便SATA的都是明顯悉大世對比)。