自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

阿里面試題:線上接口變慢,如何排查

商務(wù)辦公
這是面試阿里時(shí)的一道題,也是平時(shí)工作中處理線上問題經(jīng)常遇到的一類問題,所以耐心看完吧,無論是工作還是面試,幫助都很大。

[[383726]]

文轉(zhuǎn)載自微信公眾號「菜鳥飛呀飛」,作者劉進(jìn)坤 。轉(zhuǎn)載本文請聯(lián)系菜鳥飛呀飛公眾號。

前言

這是面試阿里時(shí)的一道題,也是平時(shí)工作中處理線上問題經(jīng)常遇到的一類問題,所以耐心看完吧,無論是工作還是面試,幫助都很大。

首先線上接口變慢,原因可能有很多,有可能是網(wǎng)絡(luò),有可能是慢 SQL,有可能是服務(wù)本身出現(xiàn)了問題,還有可能是機(jī)器達(dá)到了性能瓶頸。而機(jī)器性能瓶頸也又可以分為磁盤 IO 瓶頸、CPU 性能瓶頸、網(wǎng)卡瓶頸等等,本文主要從 CPU 出現(xiàn)性能瓶頸這個(gè)角度來分析下問題出現(xiàn)在哪兒。

為什么選 CPU 來分析呢?這是因?yàn)檫@通常是我們排查問題的第一步,自下而上排查,而通過 CPU 往往能幫助我們分析出問題出現(xiàn)在哪兒。

top

首先使用 top 命令,可以看到機(jī)器有多少個(gè) CPU,以及 CPU 過去 1 分鐘、5 分鐘、15 分鐘的平均負(fù)載,各個(gè) CPU 的使用率等信息。今天主要分析下 CPU 的負(fù)載和使用率的區(qū)別,這兩個(gè)指標(biāo)經(jīng)常容易搞混。

CPU 的負(fù)載(load)和使用率(utilization)

首先,需要明確的是,CPU 的負(fù)載(load)和使用率這兩個(gè)指標(biāo)并不是一碼事。第一,它們的計(jì)算公式不一樣,也就是說它們所代表的含義也就不一樣;第二,這兩個(gè)指標(biāo)如果異常,我們排查問題的方向也就不同。

負(fù)載的計(jì)算公式

load = (D+R)/SUM(ALL)

D 和 R 是什么意思呢?

一臺 linux 機(jī)器在運(yùn)行時(shí)會(huì)有很有很多進(jìn)程,這些進(jìn)程按照狀態(tài)可以細(xì)分為 7 類:

  1. D(TASK_UNINTERRUPTIBLE)狀態(tài):不可中斷的睡眠狀態(tài),處于睡眠狀態(tài),但是不可以被中斷。一般由 IO 等待引起(磁盤 IO,網(wǎng)絡(luò) IO、外設(shè) IO 等),出現(xiàn)非常短暫,一般很難用 ps 或者 top 等工具捕捉到,sleep 狀態(tài)下的進(jìn)程不會(huì)占用 CPU 資源。
  2. R(TASK_RUNNING)狀態(tài):可執(zhí)行狀態(tài),這種進(jìn)程處于 CPU 的可執(zhí)行隊(duì)列中,正在運(yùn)行或者等待 CPU 運(yùn)行。
  3. S(TASK_INTERRUPTIBLE)狀態(tài):可中斷的睡眠狀態(tài),不同于 D,該狀態(tài)下的進(jìn)程也是休眠狀態(tài),但是可以被中斷。這種進(jìn)程一般在等待某種事件的發(fā)生,例如:socket 連接、信號量等。一但這些時(shí)間啊完成,進(jìn)程就會(huì)被喚醒,如果不是在高負(fù)載時(shí)期,大部分進(jìn)程都處于 S 狀態(tài),不占用 CPU 資源。
  4. T(TASK_STOPPED)狀態(tài):暫停狀態(tài),進(jìn)程處于停止運(yùn)行狀態(tài)。
  5. t(TASK_TRACED)狀態(tài):跟蹤狀態(tài)。
  6. Z(EXIT_ZOMBIE)狀態(tài):僵死態(tài),這種進(jìn)程實(shí)際上已經(jīng)結(jié)束運(yùn)行了,只不過父進(jìn)程還沒有回收它的資源(比如進(jìn)程的描述符、PID 等),僵死進(jìn)程會(huì)釋放掉除了進(jìn)程入口之外的所有資源。
  7. X(EXIT_DEAD)狀態(tài):死亡態(tài)

「因此 D+R 表示的是機(jī)器的整體負(fù)載,即 CPU 負(fù)載(正在運(yùn)行著的進(jìn)程)+Disk 負(fù)載+網(wǎng)絡(luò)負(fù)載+其他外設(shè)負(fù)載,當(dāng)出現(xiàn)負(fù)載高時(shí),那么問題可能不僅僅出現(xiàn)在 R 態(tài)的進(jìn)程,還有可能是磁盤和網(wǎng)絡(luò) IO 引起的?!?/p>

CPU 的使用率

CPU 是分時(shí)間片運(yùn)行的,每個(gè)時(shí)間片會(huì)分配給一個(gè)進(jìn)程(或者線程)。

CPU 的使用率 = CPU 執(zhí)行非系統(tǒng)空閑進(jìn)程的時(shí)間 / CPU 總的執(zhí)行時(shí)間

CPU 總的執(zhí)行時(shí)間又可以細(xì)分為四大類:

1.用戶進(jìn)程使用時(shí)間(User Time)

  • i. us(user time):用戶態(tài)進(jìn)程占用的 CPU 時(shí)間
  • ii. ni(nice time):改變過優(yōu)先級的用戶態(tài)進(jìn)程占用的 CPU 時(shí)間

2.系統(tǒng)內(nèi)核使用時(shí)間(System Time)

  • a) sys(System time):系統(tǒng)內(nèi)核進(jìn)程占用的 CPU 時(shí)間
  • b) si(softirq time):軟中斷占用的 CPU 時(shí)間
  • c) hi(hard irq time):硬中斷占用的 CPU 時(shí)間

3.被搶占的時(shí)間(Steal Time)

  • a) st(steal time) 發(fā)生搶占,被強(qiáng)制中斷發(fā)生的等待時(shí)間

4.空閑時(shí)間(Idle Time)

  • a) id(idle time):除磁盤 IO 等待時(shí)間以外其它等待時(shí)間
  • b) wa(waiting time):等待磁盤 IO 的時(shí)間

因此,當(dāng) CPU 的使用率較高的時(shí)候,問題可能出現(xiàn)在用戶進(jìn)程,也可能出現(xiàn)在系統(tǒng)內(nèi)核,究竟是誰導(dǎo)致的,可以通過機(jī)器表現(xiàn)出來的現(xiàn)象或者其他的命令工具去排查(看下文)。

負(fù)載高使用率低

這種情況是通常是由于 D 狀態(tài)(不可中斷的睡眠狀態(tài))的進(jìn)程數(shù)過多導(dǎo)致的,即 CPU 使用率不高,但是 IO 負(fù)載很高。因此需要進(jìn)一步定位是磁盤 IO 導(dǎo)致的,還是網(wǎng)絡(luò) IO 導(dǎo)致的。

如何查看磁盤 IO 相關(guān)的信息呢?

可以使用命令 「iostat -x 2 5」 去查看,還可以使用 iotop 和 pidstat 查看進(jìn)程的 IO 情況。

負(fù)載高且使用率高

負(fù)載高且使用率高這種情況產(chǎn)生的原因比較多,大概可以分為下面三大類.

1.sys 高。這個(gè)時(shí)候需要進(jìn)一步查看上下文的切換(可以通過 vmstat 命令)

i. 如果是非自愿上下文切換,這種情況可能是由于 cpu 資源搶占比較激烈,由于時(shí)間片已到的原因,被系統(tǒng)強(qiáng)制調(diào)度,進(jìn)而發(fā)生上下文的切換。

ii. 如果是自愿上下文切換,這種情況可能存在大量 IO 操作或者內(nèi)存等系統(tǒng)資源存在瓶頸,大量進(jìn)程無法獲取到系統(tǒng)資源,導(dǎo)致上下文切換??梢允褂? iostat 查看 IO 情況后者 free 查看內(nèi)存情況

2.si 高,需要進(jìn)一步查看軟中斷的類型。中斷相關(guān)的信息存儲(chǔ)在/proc/softirqs (軟中斷)、/proc/interrupts(硬中斷),可以通過 cat 命令查看。si 高通??赡苁蔷W(wǎng)絡(luò) IO 或者線程調(diào)度引起的,其中軟中斷又可以分為兩大類:

a). NET_TX 和 NET_RX NET_TX 指的是發(fā)送網(wǎng)絡(luò)包的軟中斷,NET_RX 指的是接收網(wǎng)絡(luò)包的軟中斷。如果這兩者較高,那么就是系統(tǒng)的網(wǎng)絡(luò) IO 存在瓶頸的可能性較大

b). SCHED 進(jìn)程調(diào)度或者負(fù)載均衡引起的中斷,這種中斷出現(xiàn)較多時(shí),通常伴隨進(jìn)程的上下文切換,一般與非自愿上下文切換一同出現(xiàn),可能存在 CPU 瓶頸

3..us 高,這表示用戶進(jìn)程占用 CPU 較高??赡艹霈F(xiàn)的問題是:

代碼出現(xiàn)死循環(huán),此時(shí)表現(xiàn)為多核 CPU 均出現(xiàn) us 較高。(top 和 jstack 定位具體線程的堆棧)

程序?qū)儆?CPU 密集計(jì)算型,此時(shí)表現(xiàn)為多核 CPU 出現(xiàn) us 較高

內(nèi)存問題,出現(xiàn) Full GC,通常只有單核 CPU 的 us 較高(jstat -util pid)

資源等待造成線程池滿,引發(fā) CPU 使用率飆高,通常伴隨線程池異常出現(xiàn)(查看應(yīng)用日志)

如果是代碼死循環(huán)問題,這種問題比較簡單,通常的定位手段為:先使用 top 查詢出占用 CPU 使用率最高的進(jìn)程 ID(pid),然后使用 「top -H -p pid」 命令查詢出 pid 這個(gè)進(jìn)程中占用 CPU 資源最高的線程 id,此時(shí)查詢出來的線程 id 為十進(jìn)制,還需要將十進(jìn)制的線程 id 轉(zhuǎn)換為 16 進(jìn)制,可以使用如下命令:「printf "0x%x" 線程 id」,接著使用「jstack pid 線程 id」 查看該線程的堆棧信息了,根據(jù)堆棧信息就可以快速定位代碼中哪兒出現(xiàn)了死循環(huán)。

如果是 GC 問題,可以使用「jstat -util pid 1000」 命令,每隔 1 秒中打印一下 JVM 中新老年代各個(gè)區(qū)域的使用情況,系統(tǒng)多久發(fā)生一次 Full GC,每次 GC 花費(fèi)的時(shí)間。

 

責(zé)任編輯:武曉燕 來源: 菜鳥飛呀飛
相關(guān)推薦

2024-04-07 00:00:00

垃圾收集器內(nèi)存

2015-07-13 09:45:32

阿里校招

2018-12-03 09:42:32

Java程序員阿里面試

2018-01-02 09:23:38

數(shù)據(jù)分析算法阿里巴巴

2021-08-05 05:04:50

熱部署模型字節(jié)

2020-06-04 14:40:40

面試題Vue前端

2011-03-24 13:27:37

SQL

2023-11-13 07:37:36

JS面試題線程

2024-04-28 08:52:33

RabbitMQ延遲隊(duì)列延遲插件

2024-03-12 09:34:01

2021-11-02 10:10:38

面試元素語言

2015-09-02 09:32:56

java線程面試

2014-09-19 11:17:48

面試題

2009-06-06 18:34:05

java面試題

2009-06-06 18:36:02

java面試題

2012-06-28 14:35:49

Web

2024-03-04 00:00:00

系統(tǒng)架構(gòu)核心

2024-03-11 10:52:34

2021-05-31 10:08:44

工具腳本主機(jī)

2021-01-20 07:16:07

冪等性接口token
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號