成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

關于Java程序服務預熱那些事

開發 前端
所謂服務預熱,就是在服務啟動完成到對外提供服務之前,針對特定場景提供一些初始化準備操作。比如線程池預熱、緩存預熱、數據庫預熱、web預熱和JVM預熱等。

一、背景

1.1 什么是服務預熱

所謂服務預熱,就是在服務啟動完成到對外提供服務之前,針對特定場景提供一些初始化準備操作。

比如線程池預熱、緩存預熱、數據庫預熱、web預熱和JVM預熱等。

1.2 為什么要預熱

因為服務剛啟動的時候需要一段磨合期,這段期間,服務運行狀態沒有達到最佳。因此,如果這時候一下子將服務流量提升到正常水平,就有可能導致大量請求超時或者瞬間將系統壓垮。

針對 Web 應用的場景,將Java程序啟動分為兩個過程:

1、啟動過程:是指從JVM 啟動到程序初始化完成能響應第一個請求的階段。由于啟動時需要動態類加載和程序啟動時的初始化,導致啟動會比較慢。啟動慢會影響程序的響應度,減慢 Web 應用擴容。

2、預熱過程:是指從JVM 啟動到程序優化完成、達到性能峰值的階段。預熱慢會導致 Web 應用無法及時的處理完用戶請求,造成大量請求超時。

圖片圖片

二、如何預熱

2.1 預熱緩存

a.連接池預熱

和數據庫連接池一樣,我們可以在應用啟動時,根據需要初始化若干連接放入連接池,從而避免請求過來的時候再創建而影響性能。

系統啟動時,嘗試獲取若干連接(這里取最小閑置),此時連接池為空,生成連接后會放入連接池,等請求進來的時候就不會再去創建連接了。

圖片圖片

b.熱點數據預熱

  • 數據存到redis中

處理方案:

1、配置一個定時任務,刷新緩存數據。

2、直接寫個緩存刷新頁面,上線后手動刷新。

  • 數據存到本地

對于一些訪問度特別高的熱點數據,在極端情況下,考慮到服務到redis有網絡延遲以及序列化和反序列化消耗,所以放入redis緩存是不太理想的。

那么對于這些數據我們可以考慮放入本地緩存,當然這些數據量不能太大。對于極端的熱點數據放入本地緩存后,請求獲取數據在應用維度基本沒有任何消耗,沒有網絡延遲也沒有序列化和反序列化消耗。

可以使用guava 的cache

2.2 預熱線程池

1)請求接收線程池

以tomcat為例,我們可以配置初始化創建線程的數量來做線程池預熱。

圖片

2)自定義線程池

對于自定義線程池,初始化時候調用prestartAllCoreThreads方法即可。

圖片

3)預熱DB連接池

服務啟動時根據需要創建若干數據庫連接,放到連接池中,然后應用啟動處理數據庫讀寫請求時,可以直接從連接池中拿連接來用,避免了讀寫請求創建連接并放入連接池的流程耗時。

我們常用的連接池Druid提供了比較方便的連接池預熱能力。常見的配置方式:

圖片

4)JVM預熱

大家都知道,Java語言是解釋執行和編譯執行共同存在的。即Java源代碼文件(.java)首先由Javac編譯為字節碼(.class),然后字節碼由各操作系統對應的虛擬機解釋或編譯執行。

為了提高執行速度,引入了JIT(Just-in-time compilation)。在運行時,JIT會把編譯過來的機器碼保存起來,以便下次使用。JIT只會對經常執行的熱點代碼進行編譯,如循環,高頻度使用的方法等。

JVM默認開啟JIT編譯,可以檢查啟動參數-Xint和-Djava.compiler=NONE,如果有說明關閉了JIT,根據需要可以移除重新開啟JIT。

此外,JDK1.8引入了Lambda表達式,給開發人員帶來了很多方便,但是過度的使用Lambda表達式也會帶來負面效果。lambda表達式的原理是在執行時生成匿名內部類,并且需要加載和編譯。

所以對于一些熱點代碼可以選擇不使用Lambda表達式,或者在服務啟動時進行預調用,經過充分的調用之后使其成為熱點代碼,后續的調用就會走JIT編譯,就會跳過生成匿名內部類、加載的步驟,也就提升了執行效率。

三、預熱的問題及解決

3.1 時長

既然在服務啟動階段加入了預熱邏輯,就會產生損耗,最直接的體現就是服務啟動時間變長,可能幾分鐘到十幾分鐘不等。

但啟動慢不一定就是壞事,相當于是在對外提供服務之前做了充足的初始化以及預熱準備。

當然事情都有兩面性,關鍵的是要在啟動快與慢之間找到一個平衡點,在保證服務能夠在可接受的時間內啟動,并且上線之后短時間內就能提供高質量的服務。

3.2 CPU升高

在實際應用過程中,遇到了CPU突增的情況。如下圖,服務在啟動時會收到CPU報警,查看監控發現CPU使用率是平時的2倍以上。

圖片圖片

查看啟動時的預熱代碼,發現會觸發下面的請求,如圖,請求量是平時正常水平的幾百倍。因此定位應該是預熱代碼的問題。

圖片圖片

預熱代碼如下:

圖片圖片

圖片圖片

上述代碼使用CountDownLatch作為計數器,在服務啟動時,觸發三個熱點接口,以達到預熱的目的。但是由于參數過多導致服務的請求激增,引發報警。

問題定位之后,我們降低了入參數量,減少了循環次數,從而減少了服務自請求次數,問題得以修復。

四、總結

以上是服務預熱的一些常見方式,服務預熱是把雙刃劍,在使用之前,需要搞清楚哪些服務需要預熱。對于需要預熱的服務,需要搞清楚具體需要預熱哪些內容,不能盲目預熱,容易適得其反。

責任編輯:武曉燕 來源: 架構精進之路
相關推薦

2012-05-01 08:06:49

手機

2015-08-19 09:10:37

程序員面試

2012-01-02 19:30:22

iPad

2011-08-22 16:42:43

SqliteiPad

2022-05-06 07:52:06

Nacos服務注冊

2015-07-23 13:10:38

服務器虛擬化

2015-09-14 09:28:47

2011-06-30 10:59:43

2011-07-19 15:33:57

iPhone

2009-02-19 10:21:00

路由多WAN口

2021-03-18 16:05:20

SSD存儲故障

2015-08-13 10:54:46

2022-09-09 08:08:28

開源項目服務

2011-07-04 13:51:02

QT 對象 模型

2011-08-01 17:31:25

Xcode開發 Cocoa

2012-07-13 00:03:08

WEB前端開發WEB開發

2019-12-10 08:00:46

Kata容器Linux

2021-05-17 08:18:35

Java內存模型JMM

2019-01-04 10:53:59

CPUCache緩存

2012-05-01 21:27:55

圖標
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一级一片在线观看 | 国产操操操 | 成人在线观看免费视频 | 亚洲欧美日韩精品久久亚洲区 | 成人久久网 | 亚洲日日夜夜 | 亚洲丝袜天堂 | 一区二区三区四区av | 欧亚av在线| 成人精品国产一区二区4080 | 国产在线视频网 | 黑人巨大精品欧美一区二区免费 | 亚洲综合二区 | 一区二区三区高清在线观看 | 国产乱肥老妇国产一区二 | 亚洲www| 亚洲精品4 | 99久久婷婷国产综合精品 | 在线观看中文字幕 | 日本成人中文字幕 | 亚洲免费成人av | 亚洲综合99 | 国产成人精品高清久久 | 中日韩欧美一级片 | 午夜理伦三级理论三级在线观看 | 亚洲成人一区二区 | 欧美不卡一区 | 无人区国产成人久久三区 | 日韩靠逼 | 久久亚洲一区二区 | 午夜精品久久久 | 亚洲色片网站 | 99在线免费观看视频 | 欧美日韩在线视频一区 | 国产精品亚洲精品 | 欧美精品1区 | 作爱视频免费看 | 中文字幕一区二区三 | 日韩第一夜 | 久久精品视频在线观看 | 男女又爽又黄视频 |