九道深信服面試題

👉 這是一個或許對你有用的社群
🐱 一對一交流/面試小冊/簡歷最佳化/求職解惑,歡迎加入芋道快速開發平臺知識星球。下面是星球提供的部分資料:
👉這是一個或許對你有用的開源專案
國產 Star 破 10w+ 的開源專案,前端包括管理後臺 + 微信小程式,後端支援單體和微服務架構。
功能涵蓋 RBAC 許可權、SaaS 多租戶、資料許可權、商城、支付、工作流、大屏報表、微信公眾號、CRM 等等功能:
  • Boot 倉庫:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • Cloud 倉庫:https://gitee.com/zhijiantianya/yudao-cloud
  • 影片教程:https://doc.iocoder.cn
【國內首批】支援 JDK 21 + SpringBoot 3.2.2、JDK 8 + Spring Boot 2.7.18 雙版本 

有小夥伴反饋的最近面試深信服遇到的幾個“棘手”問題,今天來和大家簡單聊一聊。

一 MySQL 只有 CPU 高,怎麼最佳化

這道問題是當發現 MySQL 的 CPU 飆高,該如何最佳化?從哪些方面思考入手。
資料庫最佳化是個大學問,對症下藥尤為重要。
如果是 CPU 飆高的話,我們首先可以透過 SHOW PROCESSLIST; 來檢視正在執行的執行緒,類似下面這樣:
接下來可以根據這個表格進行排查。
首先找到 Time 這列,找出來 Time 執行時間過長的 SQL。
接下來檢視這條 SQL 的 State,根據 State 的提示我們可以做出不同的決策。
例如:
  • State 為 Locked 就表示當前操作被其他查詢鎖住了。
  • State 為 Sending Data 就表示正在處理 SELECT 查詢記錄,同時正在把結果傳送給客戶端。
  • State 為 Sleeping 表示正在等待客戶端傳送新請求。
還有很多狀態,面試時候能回答常見的幾個即可。
在這個檢查中,我們可能會發現存在的一些死鎖、或者是由於無索引/索引不合理導致的搜尋速度變慢,我們可以根據實際情況解決。
另外有時候我們在執行 SHOW PROCESSLIST; 之後,可能會發現 Command 中存在很多 Sleep,這就說明當前連線數過多,這也會影響到 MySQL 的執行效率。
那麼對於這種問題,我們可以設定等待超時時間,超時之後自動斷開,配置方式如下:

> 基於 Spring Boot + MyBatis Plus + Vue & Element 實現的後臺管理系統 + 使用者小程式,支援 RBAC 動態許可權、多租戶、資料許可權、工作流、三方登入、支付、簡訊、商城等功能

>

> * 專案地址:<https://github.com/YunaiV/ruoyi-vue-pro>

> * 影片教程:<https://doc.iocoder.cn/video/>

# vim /etc/my.cnf

[mysqld]

wait_timeout=20 

## 大於20秒自動斷開 (根據實際情況設定)

配置完成後重啟 MySQL。
如果不想重啟 MySQL 解決這個問題,可以使用如下兩條命令去解決:

> 基於 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的後臺管理系統 + 使用者小程式,支援 RBAC 動態許可權、多租戶、資料許可權、工作流、三方登入、支付、簡訊、商城等功能

>

> * 專案地址:<https://github.com/YunaiV/yudao-cloud>

> * 影片教程:<https://doc.iocoder.cn/video/>

# 設定超時等待時間
set

 global wait_timeout=60;

# 檢視設定效果

show global variables like 

'wait_timeout'

;

設定完成之後,再去檢查 CPU 使用率是否有下降。

二 MySQL 本身快取怎麼最佳化

這個題目據小夥伴描述,有一個限制條件就是 MySQL 自身的快取如何最佳化,而不是問外部快取(如 Redis)最佳化問題,並且面試官也強調了他們使用的是 MySQL5.7。
為什麼強調是 MySQL5.7 呢?因為在最新版的 MySQL8 中,查詢快取已經不再支援了。
查詢快取儲存了 SELECT 語句的文字,以及傳送給客戶端的相應結果。如果後來收到一個相同的語句,伺服器會從查詢快取中檢索結果,而不是再次解析和執行該語句。查詢快取是在會話之間共享的,因此一個客戶端產生的結果集可以被用來響應另一個客戶端發出的相同查詢。如果你有一些不經常變化的表,而伺服器收到許多相同的查詢,查詢快取在這樣的環境中很有用。
所以咱就說說 MySQL5.7 中的查詢快取吧。
首先要確認下查詢快取是否開啟了,在 MySQL5.7.2 中,查詢快取預設是關閉狀態,查詢方式如下:
如果是關閉狀態,我們可以在配置檔案中新增如下屬性來開啟:

query_cache_type=1

query_cache_size=16M

接下來執行 show status like 'qcache%'; 命令來檢視快取相關資訊:
那麼這裡有一個引數值得關注:
  • Qcache_free_blocks:這個表示查詢快取中目前還有多少剩餘的 blocks,如果該值顯示較大,則說明查詢快取中的記憶體碎片過多了,可能需要對記憶體進行整理了,整理可以使用 flush query cache 指令。
減少記憶體碎片的一個方案就是在 MySQL 的配置檔案中設定合適的 query_cache_min_res_unit,這個就是最小的記憶體分配單元。一般來說,可以將其設定為快取平均記憶體大小,快取平均大小的計算方式是這樣:
(query_cache_sizeQcache_free_memory)/Qcache_queries_in_cache
設定完成後可以再執行一段時間觀察記憶體碎片是否有減少。

三 類的載入過程

這個前面文章講過了,這裡不再贅述。

四 硬體配置提升了,反而 OOM

具體問題是說硬體配置原本是 2C4G,後來升級為 8C16G,升級之後反而發生了 OOM,硬體升級前沒問題。
老實說這個問題松哥還沒想出來一個合理的解釋,如果單是 8C16G 的硬體配置發生 OOM,這個簡單,問題是 2C4G 可以正常執行,8C16G 卻 OOM。。。
這道題歡迎小夥伴們在評論區給出自己的見解~

五 JMeter 關注哪些資訊

JMeter 我們經常用它做壓測,那麼在壓測結束後主要關注哪些指標資訊呢?
  • Samples/樣本:這個就是請求總數,比如併發是 100,迴圈次數是 100,那麼樣本數就是 100*100
  • Average/平均值:這個是平均響應時間。
  • Error/異常:測試出現的錯誤請求數量百分比。
  • Throughput/吞吐量:這個就是每秒處理的事務數,一般與具體的事務相關。如果這個值大於併發數,那麼可以嘗試增加併發數後再次測試,如果增加了併發數該值反而下降,那就說明併發數達到峰值了。
一般主要關注這幾個指標。

六 執行緒池核心數怎麼配置

通用公式是:
  • CPU 密集型:N+1
  • IO 密集型:2N+1
不過這種答案面試官一般不會滿意。
一般執行緒池核心數我們可以根據實際情況進行計算後配置,例如我們可以統計一個完整的請求中,耗費 CPU 計算的過程佔用了多少時間,等待的過程(例如讀取快取、讀取 DB 等)佔用了多少時間,假設我們的統計結果是 100ms 用來做 CPU 計算,900ms 都是 IO 相關不佔 CPU 時間,那麼我們就可以透過 (100+900)/100 的計算公式,得出,對於單核 CPU,設定執行緒數為 10 可以把 CPU 跑滿,同理,如果是 8 核 CPU,那麼就設定執行緒數為 80。

七 無監控,不調優

這道問題是接著上面一道題問的,面試官表示執行緒池執行緒數的設定是個難題,他希望能夠動態調整執行緒池執行緒數,並能夠看到調整後的效果(執行緒利用率),問有無這樣的工具能夠實現這樣的效果。

八 有無具體用過 Arthas

這個問題其實很好回答,但是如果你從來沒用過 Arthas,那麼不妨看下這篇文章,雖然講的是外掛,但是外掛生成的命令也和大家詳細解釋了:
  • Arthas命令太難記了?安利一個IDEA外掛!

九 IP 配置問題

區域網內有兩臺裝置,其中一個 IP 地址是 192.168.1.100,另一個 IP 地址是 192.168.2.100,如何讓這兩臺裝置在區域網通訊?
這個問題在網路領域裡邊屬於入門級問題,但是很多人長期做軟體開發有可能忘記了網路知識,就導致回答不出來。
這個主要是配置一下子網掩碼,設定子網掩碼為 255.255.0.0,這樣就能確保如上兩個 IP 處於同一個網段中,就可以通訊了。

歡迎加入我的知識星球,全面提升技術能力。
👉 加入方式,長按”或“掃描”下方二維碼噢
星球的內容包括:專案實戰、面試招聘、原始碼解析、學習路線。
文章有幫助的話,在看,轉發吧。
謝謝支援喲 (*^__^*)

相關文章