新聞中心
系統(tǒng)架構(gòu)師思考
創(chuàng)新互聯(lián)建站主營常山網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,重慶APP軟件開發(fā),常山h5成都小程序開發(fā)搭建,常山網(wǎng)站營銷推廣歡迎常山等地區(qū)企業(yè)咨詢
秒殺活動(dòng)是指網(wǎng)絡(luò)商家為促銷等目的組織會(huì)網(wǎng)上限時(shí)搶購活動(dòng),這種活動(dòng)具有瞬時(shí)并發(fā)量大、庫存量少和業(yè)務(wù)邏輯簡單等特點(diǎn)。
設(shè)計(jì)一個(gè)秒殺系統(tǒng)需要考慮的因素很多,比如對(duì)現(xiàn)有業(yè)務(wù)的影響、網(wǎng)絡(luò)帶寬消耗以及超賣等因素。本文會(huì)討論秒殺系統(tǒng)的各個(gè)環(huán)節(jié)可能存在的問題以及解決方案。
四大核心課題思考
一、JVM調(diào)優(yōu)(調(diào)優(yōu)原理,上線調(diào)優(yōu)細(xì)節(jié),掌握基本調(diào)優(yōu)參數(shù)設(shè)置,調(diào)優(yōu)一些經(jīng)驗(yàn)),GC日志分析,進(jìn)一步調(diào)優(yōu)。
二、數(shù)據(jù)庫調(diào)優(yōu)(連接池調(diào)優(yōu),數(shù)據(jù)庫常見設(shè)計(jì)調(diào)優(yōu),緩存)。
三、多級(jí)緩存優(yōu)化(堆內(nèi)緩存,分布式緩存,openresty內(nèi)存字典, lua+redis實(shí)現(xiàn)接入層緩存)。
四、秒殺下單(高并發(fā)模式下實(shí)現(xiàn)下單操作—滿足業(yè)務(wù)需求)-- Lock鎖,AOP鎖優(yōu)化,分布式鎖優(yōu)化。
高性能架構(gòu)
以用戶為中心,提供快速的網(wǎng)頁訪問體驗(yàn)。主要參數(shù)有較短的響應(yīng)時(shí)間、較大的并發(fā)處理能力、較高的吞吐量與穩(wěn)定的性能參數(shù)。
可分為前端優(yōu)化、應(yīng)用層優(yōu)化、代碼層優(yōu)化與存儲(chǔ)層優(yōu)化。
- 前端優(yōu)化:網(wǎng)站業(yè)務(wù)邏輯之前的部分;--- vue ,react +nodejs – 工程化。
- 瀏覽器優(yōu)化:減少HTTP請(qǐng)求數(shù),使用瀏覽器緩存,啟用壓縮,CSS JS位置,JS異步,減少Cookie傳輸;CDN加速,反向代理。
- 應(yīng)用層優(yōu)化:處理網(wǎng)站業(yè)務(wù)的服務(wù)器。使用緩存,異步,集群,架構(gòu)優(yōu)化。
- 代碼優(yōu)化:多線程,資源復(fù)用(對(duì)象池,線程池等),良好的數(shù)據(jù)結(jié)構(gòu),JVM調(diào)優(yōu),單例,Cache等。
- 存儲(chǔ)優(yōu)化:緩存、固態(tài)硬盤、光纖傳輸、優(yōu)化讀寫、磁盤冗余、分布式存儲(chǔ)(HDFS)、NoSQL等。
總結(jié):
①服務(wù)盡量進(jìn)行拆分(微服務(wù))---- 提高項(xiàng)目吞吐能力。
②盡量將請(qǐng)求攔截在上游服務(wù)(多級(jí)緩存)--- 90% ----> 數(shù)據(jù)庫壓力非常小,閑庭信步,數(shù)據(jù)庫架構(gòu)(主從架構(gòu))。
③代理層:做限速,限流。
④服務(wù)層:按照業(yè)務(wù)請(qǐng)求做隊(duì)列的流量控制(流量削峰)。
可伸縮架構(gòu)
伸縮性是指在不改變?cè)屑軜?gòu)設(shè)計(jì)的基礎(chǔ)上,通過添加/減少硬件(服務(wù)器)的方式,提高/降低系統(tǒng)的處理能力。
- 應(yīng)用層:對(duì)應(yīng)用進(jìn)行垂直或水平切分。然后針對(duì)單一功能進(jìn)行負(fù)載均衡(DNS、HTTP[反向代理]、IP、鏈路層)。
- 服務(wù)層:與應(yīng)用層類似。
- 數(shù)據(jù)層:分庫、分表、NoSQL等;常用算法Hash,一致性Hash。
云原生:項(xiàng)目運(yùn)行云端,可以隨時(shí)動(dòng)態(tài)擴(kuò)容—K8S。
8C+16G : 2000QPS +-。
(此數(shù)字是估算結(jié)果,真實(shí)結(jié)果受到代碼編寫數(shù)據(jù)結(jié)構(gòu),業(yè)務(wù)邏輯,架構(gòu)、rt,以現(xiàn)實(shí)測試結(jié)果)。
可擴(kuò)展架構(gòu)
SOA --- 微服務(wù) --- 業(yè)務(wù)拆分模塊 --- 新業(yè)務(wù)需求 --- 根據(jù)新業(yè)務(wù)需求創(chuàng)建新模塊服務(wù)。
可以方便地進(jìn)行功能模塊的新增/移除,提供代碼/模塊級(jí)別良好的可擴(kuò)展性。
- 模塊化、組件化:高內(nèi)聚,低耦合,提高復(fù)用性,擴(kuò)展性。
- 穩(wěn)定接口:定義穩(wěn)定的接口,在接口不變的情況下,內(nèi)部結(jié)構(gòu)可以“隨意”變化。
- 設(shè)計(jì)模式:應(yīng)用面向?qū)ο笏枷?,原則,使用設(shè)計(jì)模式,進(jìn)行代碼層面的設(shè)計(jì)。
- 消息隊(duì)列:模塊化的系統(tǒng),通過消息隊(duì)列進(jìn)行交互,使模塊之間的依賴解耦。
- 分布式服務(wù):公用模塊服務(wù)化,提供其他系統(tǒng)使用,提高可重用性,擴(kuò)展性。
安全架構(gòu)
對(duì)已知問題有有效的解決方案,對(duì)未知/潛在問題建立發(fā)現(xiàn)和防御機(jī)制。對(duì)于安全問題,首先要提高安全意識(shí),建立一個(gè)安全的有效機(jī)制,從政策層面,組織層面進(jìn)行保障,比如服務(wù)器密碼不能泄露,密碼每月更新,每周安全掃描等。
以制度化的方式,加強(qiáng)安全體系的建設(shè)。同時(shí),需要注意與安全有關(guān)的各個(gè)環(huán)節(jié)。安全問題不容忽視,包括基礎(chǔ)設(shè)施安全,應(yīng)用系統(tǒng)安全,數(shù)據(jù)保密安全等。
基礎(chǔ)設(shè)施安全:
硬件采購,操作系統(tǒng),網(wǎng)絡(luò)環(huán)境方面的安全。一般采用正規(guī)渠道購買高質(zhì)量的產(chǎn)品,選擇安全的操作系統(tǒng),及時(shí)修補(bǔ)漏洞,安裝殺毒軟件防火墻。防范病毒,后門。設(shè)置防火墻策略,建立DDOS防御系統(tǒng),使用攻擊檢測系統(tǒng),進(jìn)行子網(wǎng)隔離等手段。
應(yīng)用系統(tǒng)安全:
在程序開發(fā)時(shí),對(duì)已知常用問題,使用正確的方式,在代碼層面解決掉。防止跨站腳本攻擊(XSS),注入攻擊,跨站請(qǐng)求偽造(CSRF),錯(cuò)誤信息,HTML注釋,文件上傳,路徑遍歷等。還可以使用Web應(yīng)用防火墻(比如:ModSecurity),進(jìn)行安全漏洞掃描等措施,加強(qiáng)應(yīng)用級(jí)別的安全。
數(shù)據(jù)保密安全:
存儲(chǔ)安全(存儲(chǔ)在可靠的設(shè)備,實(shí)時(shí),定時(shí)備份),保存安全(重要的信息加密保存,選擇合適的人員復(fù)雜保存和檢測等),傳輸安全(防止數(shù)據(jù)竊取和數(shù)據(jù)篡改)。
常用的加解密算法(單項(xiàng)散列加密[MD5、SHA],對(duì)稱加密[DES、3DES、RC]),非對(duì)稱加密[RSA]等。
一、互聯(lián)網(wǎng)架構(gòu)演進(jìn)思考
1、架構(gòu)演進(jìn)
單體架構(gòu)(all in one) à水平拆分/SOA架構(gòu)à微服務(wù)架構(gòu) àkubernetes云原生架構(gòu)(微服務(wù)遷移到云原生)à ServiceMesh (服務(wù)網(wǎng)格架構(gòu),下一代微服務(wù)架構(gòu),云原生架構(gòu):istio) à serverless 架構(gòu) (無服務(wù)架構(gòu))。
企業(yè)架構(gòu)轉(zhuǎn)型:數(shù)字化轉(zhuǎn)型。
傳統(tǒng)架構(gòu)過渡到云原生架構(gòu)(容器云)。
2、 單體架構(gòu)
(1)單體架構(gòu)——所有業(yè)務(wù)都在同一個(gè)應(yīng)用中,沒有進(jìn)行任何拆分。
注意:集中式架構(gòu)模式,所有的請(qǐng)求都集中在同一個(gè)服務(wù)上面,對(duì)服務(wù)壓力較大;因此這樣的架構(gòu)適合并發(fā)較小的架構(gòu);同時(shí) 同一個(gè)服務(wù)器中,數(shù)據(jù)庫,項(xiàng)目都會(huì)搶占服務(wù)內(nèi)存,cpu資源,造成服務(wù)性能問題。
(2)單體架構(gòu)優(yōu)化。
- 應(yīng)用程序 MYSQL分離部署。
- 服務(wù)集群– 提升性能。
- 動(dòng)態(tài)分離(靜態(tài)資源存儲(chǔ)CDN,nginx服務(wù)器)。
- 隔離術(shù)(線程池隔離,進(jìn)程隔離)。
- 隊(duì)列術(shù) (blockingQueue,disruptor隊(duì)列,RocketMQ)。
- 接入層限流(openresty), 接口限流。
- MySQL優(yōu)化(索引,緩存,表結(jié)構(gòu),分表分庫,數(shù)據(jù)歸檔,冷熱,SQL語句優(yōu)化)。
- 引入lvs (linux virtual server)。
- DNS 解決上層流量瓶頸問題。
- 多級(jí)緩存。
(3)單體架構(gòu)流量預(yù)估(單體架構(gòu)真的不能承受億級(jí)流量??)單體架構(gòu):中小型企業(yè),創(chuàng)業(yè)公司。
①傳統(tǒng)項(xiàng)目(并發(fā)量小,業(yè)務(wù)簡單,需求固定),項(xiàng)目體量比較小
②小程序
③追求極致性能的項(xiàng)目(業(yè)務(wù)量少)
④互聯(lián)網(wǎng)項(xiàng)目(中小型企業(yè),創(chuàng)業(yè)公司)
需求:
某網(wǎng)站平均一天下單量100w單,根據(jù)100w 評(píng)估一下系統(tǒng)的流量!
用戶行為:
①產(chǎn)生的時(shí)間段:11:00 – 2:00 5:00 – 12:00 ,訂單產(chǎn)生時(shí)間段:12h。
②每下一單會(huì)發(fā)生多少個(gè)請(qǐng)求:50QPS x 3 = 150 QPS。
計(jì)算流量:
100w / day * 150 QPS = 1.5 億 ----- 億級(jí)流量。
計(jì)算平均每一秒QPS:
1.5億/12 h = 1250 QPS / 60min = 20W / 60s = 3400 QPS。
(4)單點(diǎn)架構(gòu)優(yōu)缺點(diǎn)。
單體架構(gòu)優(yōu)點(diǎn):
①部署簡單
②開發(fā)簡單
③測試簡單
④集群簡單
⑤RT響應(yīng)時(shí)間非常快速 —— 適合一些特點(diǎn)的項(xiàng)目(極端苛刻響應(yīng)時(shí)間)。
單體架構(gòu)問題:
①流量比較集中,所有的請(qǐng)求都集中一個(gè)服務(wù)中,單體無法應(yīng)對(duì)
②無法實(shí)現(xiàn)敏捷開發(fā),業(yè)務(wù)增大,代碼結(jié)構(gòu)越來越臃腫,維護(hù)變得非常困難單體架構(gòu):war > 1G --- IBM unix 高性能服務(wù)器 64cpus, 128GB --- 1GB
③單體架構(gòu)牽一發(fā)而動(dòng)全身
④擴(kuò)展性差
⑤穩(wěn)定性差
3、架構(gòu)拆分
隨著業(yè)務(wù)流量增大,需求的增多,必須對(duì)架構(gòu)進(jìn)行改進(jìn),就需要對(duì)項(xiàng)目進(jìn)行業(yè)務(wù)拆分;(水平拆分,垂直拆分)。
數(shù)據(jù)庫水平拆分,垂直拆分模式:
(1)水平拆分模式。
(2)垂直拆分:SOA架構(gòu)。
4、微服務(wù)架構(gòu)
注意:微服務(wù)架構(gòu)就是水平拆分和垂直拆分的架構(gòu)結(jié)合,就是微服務(wù)架構(gòu)。
5、ServiceMesh架構(gòu)
ServiceMesh服務(wù)網(wǎng)格架構(gòu),CNCF把ServiceMesh定義為云原生架構(gòu),ServiceMesh落地級(jí)實(shí)現(xiàn)的成熟框架:Istio框架。
問題:為什么要是有ServiceMesh架構(gòu)?
Spring Cloud alibaba微服務(wù)架構(gòu)存在問題?
--ServiceMesh出現(xiàn)就是為了解決微服務(wù)架構(gòu)中存在一些問題?
①服務(wù)性能監(jiān)控(Zabbix,promutheus)2、服務(wù)限流(sentinel)
②服務(wù)降級(jí)(sentinel)
③服務(wù)熔斷(sentinel)
④鏈路追蹤(skywalking)
⑥日志監(jiān)控(elk)
⑦服務(wù)告警
⑧負(fù)載均衡
以上一系列的問題,作為架構(gòu)師,開發(fā)人員都需要全盤的考慮;開發(fā)微服務(wù)架構(gòu)在服務(wù)治理,服務(wù)監(jiān)控非常困難。
以上的工作和業(yè)務(wù)沒有太多的關(guān)系,但是架構(gòu)人員必須考慮,架構(gòu),設(shè)計(jì),因此這些配套工作都會(huì)大大降低我們的開發(fā)效率,提升開發(fā)難度,增加開發(fā)成本。
6、Serverless
Serverless架構(gòu)體系:無服務(wù)架構(gòu),面向未來的架構(gòu)體系,從開發(fā)人員來說,不需要關(guān)心底層哪些和業(yè)務(wù)沒有關(guān)系的代碼,只需要開發(fā)業(yè)務(wù)即可。
例如:向CDN上傳圖片,視頻文件。
①不需要上傳到哪一個(gè)服務(wù)器
②不需要關(guān)心服務(wù)器是如何擴(kuò)容的
這樣的概念,思想就叫做Serverless。
總結(jié):架構(gòu)選型的時(shí)候,必須選擇企業(yè)合適的架構(gòu),而不是采用最新架構(gòu)。
二、性能調(diào)優(yōu)思考-JVM
1、JVM的調(diào)優(yōu)思考
思考題1
項(xiàng)目上線后,是什么原因促使必須進(jìn)行jvm調(diào)優(yōu)?
答案:調(diào)優(yōu)的目的就是提升服務(wù)性能。
(1)jvm 堆內(nèi)存空間對(duì)象太多(Java線程,垃圾對(duì)象),導(dǎo)致內(nèi)存被占滿,程序跑不動(dòng)—性能嚴(yán)重下降。
調(diào)優(yōu):及時(shí)釋放內(nèi)存
(2)垃圾回收線程太多,頻繁回收垃圾(垃圾回收線程也會(huì)占用內(nèi)存資源,搶占cpu資源),必然會(huì)導(dǎo)致程序性能下降。
調(diào)優(yōu):防止頻繁gc。
(3)垃圾回收導(dǎo)致stw(stop the world)。
調(diào)優(yōu):盡可能的減少gc次數(shù)。
思考題2
jvm調(diào)優(yōu)本質(zhì)是什么?
答案:jvm調(diào)優(yōu)的本質(zhì)就是(對(duì)內(nèi)存的調(diào)優(yōu)) 及時(shí)回收垃圾對(duì)象,釋放內(nèi)存空間;讓程序性能得以提升,讓其他業(yè)務(wù)線程可以獲得更多內(nèi)存空間;
思考題3
是否可以把JVM內(nèi)存空設(shè)置的足夠大(無限大),是不是就不需要垃圾回收呢?
前提條件:內(nèi)存空間被裝滿了以后,才會(huì)觸發(fā)垃圾回收器來回收垃圾。
答案:理論上是的,現(xiàn)實(shí)情況不行的!
尋址能力:
(是否有這么大的空間)。
32位操作系統(tǒng) === 4GB 內(nèi)存。
64位操作系統(tǒng) === 16384 PB 內(nèi)存空間。
Jvm堆內(nèi)存空間大小的設(shè)置:必須設(shè)置一個(gè)合適的內(nèi)存空間,不能太大,也不能太小。
問題1:考慮到尋址速度的問題,尋址一個(gè)對(duì)象消耗的時(shí)間比較長的。
問題2:一旦觸發(fā)垃圾回收,將會(huì)是一個(gè)災(zāi)難;(只能重啟服務(wù)器)。
2、JVM的調(diào)優(yōu)原則
(1) gc的時(shí)間足夠小(堆內(nèi)存設(shè)置足夠?。?/p>
垃圾回收時(shí)間足夠小,以為著jvm堆內(nèi)存空間設(shè)置小一些,這樣的話 垃圾對(duì)象尋址的時(shí)候消耗的時(shí)間就非常短,然后整個(gè)垃圾回收非??焖?。
(2) gc的次數(shù)足夠少 (jvm堆內(nèi)存設(shè)置的足夠大)。
Gc次數(shù)足夠少,jvm堆內(nèi)存空間必須設(shè)置的足夠大;這樣垃圾回收觸發(fā)次數(shù)就會(huì)相應(yīng)減少。
注意:原子1 ,原則2 相互沖突的,原則1&&原則2 。需要進(jìn)行balance,內(nèi)存空間既不能設(shè)置太大,也不能設(shè)置太小。
(3) 發(fā)生fullgc 周期足夠長 (最好不發(fā)生full gc)。
metaspace 永久代空間設(shè)置大小合理,metaspace一旦擴(kuò)容,就會(huì)發(fā)生fullgc。
老年代空間設(shè)置一個(gè)合理的大小,防止full gc。
盡量讓垃圾對(duì)象在年輕代被回收(90%)。
盡量防止大對(duì)象的產(chǎn)生,一旦大對(duì)象多了以后,就可能發(fā)生full gc ,甚至oom。
3、JVM的調(diào)優(yōu)原理
什么是垃圾?
JVM調(diào)優(yōu)的本質(zhì):回收垃圾,及時(shí)釋放內(nèi)存空間。
但是什么是垃圾?
在內(nèi)存中間中,哪些沒有被引用的對(duì)象就是垃圾(高并發(fā)模式下,大量的請(qǐng)求在內(nèi)存空間中創(chuàng)建了大量的對(duì)象,這些對(duì)象并不會(huì)主動(dòng)消失,因此必須進(jìn)行垃圾回收,當(dāng)然Java垃圾回收必須我們自己編寫垃圾回收代碼,Java提供各種垃圾回收器幫助回收垃圾,JVM垃圾回收是自動(dòng)進(jìn)行的)。
一個(gè)對(duì)象的引用消失了,這個(gè)對(duì)象就是垃圾,因此此對(duì)象就必須被垃圾回收器進(jìn)行回收,及時(shí)釋放內(nèi)存空間。
怎么找垃圾?
Jvm提供了2種方式找到這個(gè)垃圾對(duì)象:
(1)引用計(jì)數(shù)算法 找垃圾。
(2)根可達(dá)算法 找垃圾 hotspot 垃圾回收器都是使用這個(gè)算法。
(1)引用計(jì)數(shù)算法
引用計(jì)數(shù)算法:對(duì)每一個(gè)對(duì)象的引用數(shù)量進(jìn)行一個(gè)計(jì)數(shù),當(dāng)引用數(shù)為0時(shí),那么此對(duì)象就變成了一個(gè)垃圾對(duì)象。
存在問題:不能解決循環(huán)引用的問題,如果存在循環(huán)引用的話,無法發(fā)現(xiàn)垃圾。
這三個(gè)對(duì)象處于循環(huán)引用的狀態(tài),引用計(jì)數(shù)都不為0,因此無法判斷這個(gè)3個(gè)對(duì)象是垃圾。
(2)根可達(dá)算法
根據(jù)根對(duì)象向下進(jìn)行遍歷,如果遍歷不到的對(duì)象就是垃圾。
如何清除垃圾?
JVM提供了3種方式清除垃圾,分別是:
①mark-sweep 標(biāo)記清楚算法。
②copying 拷貝算法。
③mark-compact 標(biāo)記整理(壓縮)算法。
①第一種算法:mark-sweep 標(biāo)記清楚算法。
①使用根可達(dá)算法找到垃圾對(duì)象,對(duì)垃圾對(duì)象進(jìn)標(biāo)記 (做一個(gè)標(biāo)記)。
②對(duì)標(biāo)記對(duì)象進(jìn)行刪除(清除)。
優(yōu)點(diǎn):簡單,高效。
缺點(diǎn):清除的對(duì)象都不是一個(gè)連續(xù)的空間,清除垃圾后,產(chǎn)生很多內(nèi)存碎片;不利于后期對(duì)象內(nèi)存分配,及尋址。
②第二種算法:copying拷貝算法。
一開始就把內(nèi)存控制一份為2,分為2個(gè)大小相同的的內(nèi)存空間,另一半空間展示空閑:
①選擇(尋址)存活對(duì)象。
②把存活對(duì)象拷貝到另一半空閑空間中,且是連續(xù)的內(nèi)存空間。
③把存儲(chǔ)對(duì)象拷貝結(jié)束后,另一半空間中全是垃圾,直接清除另一半空間即可。
優(yōu)點(diǎn):簡單,內(nèi)存空間是連續(xù)的,不存在內(nèi)存空間碎片。
缺點(diǎn):內(nèi)存空間浪費(fèi)。
③第三種算法:mark-compact標(biāo)記整理(壓縮)算法。
①選擇(尋址)存活對(duì)象。
②把存活對(duì)象拷貝到另一半空閑空間中,且是連續(xù)的內(nèi)存空間。
③把存儲(chǔ)對(duì)象拷貝結(jié)束后,另一半空間中全是垃圾,直接清除另一半空間即可。
垃圾回收器
Java提供很多的垃圾回收器:10種垃圾回收器。
特點(diǎn):
1、Serial Serial Old , parNew CMS , Parallel Scavenge Parallel Old 都屬于物理分代垃圾回收器;年輕代,老年代分別使用不同的垃圾回收器。
2、G1 在邏輯上進(jìn)行分代的,進(jìn)行在使用上非常方便,關(guān)于年輕代,老年代只需要使用一個(gè)垃圾回收器即可。
3、ZGC ZGC是一款JDK 11中新加入的具有實(shí)驗(yàn)性質(zhì)的低延遲垃圾收集器。
4、Shenandoah OpenJDK 垃圾回收器。
5、Epsilon 是Debug使用的,調(diào)試環(huán)境下:驗(yàn)證jvm內(nèi)存參數(shù)設(shè)置的可行性。
6、Serial Serial Old:串行化的垃圾回收器。
7、parNew CMS :并行,并發(fā)的垃圾回收器。
8、Parallel Scavenge Parallel Old :并行的垃圾回收器。
常用的垃圾回收器組合:
1、Serial + Serial Old: 串行化的垃圾回收器,適合單核心的cpu的服務(wù)情況。
2、parNew + CMS:響應(yīng)時(shí)間優(yōu)先組合。
3、Parallel Scavenge + Parallel Old :吞吐量優(yōu)先組合。
4、g1 :邏輯上分代的垃圾回收器組合。
4、垃圾回收器原理
Serial+Serial Old
Serial : 年輕代的垃圾回收器,單線程的垃圾回收器;Serial Old是老年代的垃圾回收器,也是一個(gè)單線程的垃圾回收器,合適單核心cpu。
注意特點(diǎn):
1、stw : 當(dāng)進(jìn)行g(shù)c的時(shí)候,整個(gè)業(yè)務(wù)線程都會(huì)被停止,如果stw時(shí)間過長,或者stw發(fā)生次數(shù)過多,都會(huì)影響程序的性能。
2、垃圾回收器線程:多線程,單線程,并發(fā),并行。
Parallel Scavenge + Parallel Old
Parallel Scavenge + Parallel Old :
并行的垃圾回收器;吞吐量優(yōu)先的垃圾回收器組合,是JDK8默認(rèn)的垃圾回收器;問題 : 什么是并發(fā),并行?
并發(fā):
并行:
PS + PO 回收垃圾的時(shí)候,采用的多線程模式回收垃圾。
注意特點(diǎn):
1、stw : 當(dāng)進(jìn)行g(shù)c的時(shí)候,整個(gè)業(yè)務(wù)線程都會(huì)被停止,如果stw時(shí)間過長,或者stw發(fā)生次數(shù)過多,都會(huì)影響程序的性能。
2、垃圾回收器線程:多線程,單線程,并發(fā),并行。
parNew+CMS
parNew : 并行垃圾回收器,年輕代的垃圾回收器。
CMS : 并發(fā)垃圾回收器,回收老年代的垃圾。
年輕代垃圾回收器:parNew。
老年代垃圾回收器:CMS。
注意:任何的垃圾回收器都無法避免 STW ,因此jvm調(diào)優(yōu)實(shí)際上就是調(diào)整stw的時(shí)間。
G1
使用G1收集器時(shí),它將整個(gè)Java堆劃分成約2048個(gè)大小相同的獨(dú)立Region塊,每個(gè)Region塊大小根據(jù)堆空間的實(shí)際大小。
而定,整體被控制 在1MB到32MB之間,且為2的N次冪,即1MB,2MB,4MB,8MB,16MB,32MB??梢酝ㄟ^-XX:G1HeapRegionsize設(shè)定。
所有的Region大小相同,且在JVM生命周期內(nèi)不會(huì)被改變。
5、 內(nèi)存分代模型
通過內(nèi)存分代模型結(jié)構(gòu):大多數(shù)對(duì)象都會(huì)在年輕代被回收掉(90%+),很多對(duì)象都在15次的垃圾回收中被回收掉了,只有超過15次還沒被回收掉的才會(huì)進(jìn)入到老年代區(qū)域。
垃圾回收觸發(fā)時(shí)機(jī):
1、ps+po : 當(dāng)堆內(nèi)存被裝滿了,才會(huì)觸發(fā)垃圾回收(eden區(qū)域滿了,觸發(fā)了垃圾回收,old區(qū)域滿了,觸發(fā)垃圾回收)。
2、cms 垃圾回收器。
①JDK1.5:68% ,當(dāng)eden區(qū)域裝對(duì)象達(dá)到68%時(shí)候,就會(huì)觸發(fā)垃圾回收。
②JDK1.6+ : 92%才會(huì)觸發(fā)垃圾回收器。
一個(gè)新對(duì)象被創(chuàng)建了,但是這個(gè)對(duì)象是一個(gè)大對(duì)象(查詢?nèi)恚?,eden區(qū)域已經(jīng)放不下了,此時(shí)會(huì)發(fā)生什么?
6、JVM的實(shí)戰(zhàn)調(diào)優(yōu)
明確:jvm調(diào)優(yōu)本質(zhì)
1、JVM調(diào)優(yōu)本質(zhì)就是 gc , 垃圾回收,及時(shí)釋放內(nèi)存空間。
2、gc次數(shù)要少,gc時(shí)間少,防止fulllgc --- 內(nèi)存參數(shù)設(shè)置。
典型參數(shù)設(shè)置
服務(wù)器硬件配置:4cpu,8GB內(nèi)存 --- jvm調(diào)優(yōu)內(nèi)存,考慮內(nèi)存。
1、-Xmx4000m 設(shè)置JVM最大堆內(nèi)存(經(jīng)驗(yàn)值:3500m – 4000m,內(nèi)存設(shè)置大小,沒有一個(gè)固定的值,根據(jù)業(yè)務(wù)實(shí)際情況來進(jìn)行設(shè)置的,根據(jù)壓力測試,根據(jù)性能反饋情況,去做參數(shù)調(diào)試)。
2、-Xms4000m 設(shè)置JVM堆內(nèi)存初始化的值,一般情況下,初始化的值和最大堆內(nèi)存值必須一致,防止內(nèi)存抖動(dòng)。
3、-Xmn2g 設(shè)置年輕代內(nèi)存對(duì)象(eden,s1,s2)。
4、-Xss256k 設(shè)置線程棧大小,JDK1.5+版本線程棧默認(rèn)是1MB, 相同的內(nèi)存情況下,線程堆棧越小,操作系統(tǒng)創(chuàng)建的線程越多。
nohup java -Xmx4000m -Xms4000m -Xmn2g -Xss256k -jar jshop-web-1.0-SNAPSHOT.jar --spring.config.addition-location=application.yaml > jshop.log 2>&1 &
壓力測試:查看在此內(nèi)存設(shè)置模式下性能情況:
根據(jù)壓力測試結(jié)果,發(fā)現(xiàn)JVM參數(shù)設(shè)置,和之前沒有設(shè)置吞吐能力沒有太大的變化,因?yàn)闇y試樣本不足以造成 gc,fullgc時(shí)間上差異。
問題:根據(jù)什么標(biāo)準(zhǔn)判斷參數(shù)設(shè)置是否合理呢??根據(jù)什么指標(biāo)進(jìn)行調(diào)優(yōu)呢?1、發(fā)生幾次gc, 是否頻繁的發(fā)送gc?2、是否發(fā)生fullgc ,full gc發(fā)生是否合理3、gc的時(shí)間是否合理4、oom。
7、GC的日志輸出
輸出日志啟動(dòng)指令如下所示:
nohup java -Xmx4000m -Xms4000m -Xmn2g -Xss256k -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:gc.log -jar jshop-web-1.0-SNAPSHOT.jar --spring.config.addition-location=application.yaml > jshop.log 2>&1 &
輸出日志指令:
-XX:+PrintGCDetails 打印GC詳細(xì)信息
-XX:+PrintGCTimeStamps 打印GC時(shí)間信息
-XX:+PrintGCDateStamps 打印GC日期的信息
-XX:+PrintHeapAtGC 打印GC堆內(nèi)存信息
-Xloggc:gc.log 把gc信息輸出gc.log文件中
執(zhí)行啟動(dòng)指令后,在本地產(chǎn)生gc.log文件:
GC日志分析: 使用https://gceasy.io/導(dǎo)入gc.log 進(jìn)行在線分析即可。
Gc日志分析報(bào)告:
總結(jié):可以發(fā)現(xiàn) 業(yè)務(wù)線程執(zhí)行時(shí)間占比達(dá)到99%+,說明gc時(shí)間在整個(gè)業(yè)務(wù)執(zhí)行期間所占用的時(shí)間非常少,幾乎不會(huì)影響程序性能;導(dǎo)致業(yè)務(wù)線程執(zhí)行時(shí)間占比高的原因是:
1、程序樣本數(shù)不夠。
2、程序運(yùn)行的時(shí)間不夠。
3、業(yè)務(wù)場景不符合要求(查詢沒有太多的對(duì)象數(shù)據(jù))。
存在問題:發(fā)生full gc。
GC詳細(xì)數(shù)據(jù)分析:
fullgc頻繁發(fā)生:
查詢gc內(nèi)存模型:jstat -gcutil PID 查詢此進(jìn)程的內(nèi)存模型。
Metaspace永久代空間:默認(rèn)為20m(初始化大?。?;當(dāng)metaspace被占滿后,就會(huì)發(fā)生擴(kuò)容,一旦metaspace發(fā)生一次擴(kuò)容,就會(huì)同時(shí)發(fā)送一次fullgc 。
Sun公司推薦設(shè)置:年輕代占整個(gè)堆內(nèi)存 3/8。
發(fā)現(xiàn)full gc 已經(jīng)沒有發(fā)生了。
Yong &old比例
Sun公司推薦設(shè)置:整個(gè)堆的大小=年輕代 + 老年代 + 永久代(256m)年輕代占整個(gè)堆內(nèi)存3/8 , -Xmx4000m , 因此整個(gè)堆內(nèi)存設(shè)置大小為4000m,也就是說年輕代大小應(yīng)該設(shè)置為1.5G:
①定義年輕代:-Xmn1500m,剩下的空間就是老年代的空間。
②參數(shù):-XX:NewRatio = 4 表示年輕代(eden ,s0,s1) 和老年代區(qū)域所占比值 1:4。
年輕代大小,老年代大小比值根據(jù)業(yè)務(wù)實(shí)際情況設(shè)置比例,(通過設(shè)置相應(yīng)的比例:減少相應(yīng)yonggc ,fullgc)。
JVM調(diào)優(yōu)的原則中:要求盡量防止fullgc的發(fā)生;因此可以把fullgc設(shè)置的稍微大一些;以為old區(qū)域裝載對(duì)象很長時(shí)間才能裝滿(或者永遠(yuǎn)都裝不滿),發(fā)生fullgc概率就非常小。
Eden&s0&s1
官方給定設(shè)置:可以設(shè)置eden,s區(qū)域大?。?:1:1 à -XX:SurvivorRatio = 8。
此調(diào)優(yōu)的原理:盡量讓對(duì)象在年輕代被回收;調(diào)大了eden區(qū)域的空間,讓更多對(duì)象進(jìn)入到eden區(qū)域,觸發(fā)gc時(shí)候,更多的對(duì)象被回收。
nohup java -Xmx4000m -Xms4000m -Xmn1500m -Xss256k -XX:MetaspaceSize=256m -XX:SurvivorRatio=8 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:gc.log -jar jshop-web-1.0-SNAPSHOT.jar --spring.config.addition-location=application.yaml > jshop.log 2>&1 &
可以發(fā)現(xiàn)業(yè)務(wù)占比時(shí)間發(fā)送提升,說明gc時(shí)間更少了。
總結(jié):JVM調(diào)優(yōu)(調(diào)整內(nèi)存大小、比例) 降低 gc次數(shù),減少gc時(shí)間,從而提升服務(wù)性能。
調(diào)優(yōu)標(biāo)準(zhǔn):項(xiàng)目上線后,遇到問題,調(diào)優(yōu)。
1、gc消耗時(shí)間 –業(yè)務(wù)時(shí)間占比。
2、頻繁發(fā)生fullgc – 調(diào)優(yōu) – stw—程序暫停時(shí)間比較長,阻塞,導(dǎo)致整個(gè)程序崩潰。
3、oom --- 調(diào)優(yōu)。
8、GC組合
吞吐量優(yōu)先
并行的垃圾回收器:parallel scavenge(年輕代) + parallel old(老年代) ---- 是JDK默認(rèn)的垃圾回收器。
nohup java -Xmx4000m -Xms4000m -Xmn1500m -Xss256k -XX:MetaspaceSize=256m -XX:SurvivorRatio=8 -XX:+UseParallelGC -XX:+UseParallelOldGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:gc.log -jar jshop-web-1.0-SNAPSHOT.jar --spring.config.addition-location=application.yaml > jshop.log 2>&1 &
顯式的配置PS+PO垃圾回收器:-XX:+UseParallelGC -XX:+UseParallelOldGC。
響應(yīng)時(shí)間優(yōu)先
并行垃圾回收器(年輕代),并發(fā)垃圾回收器(老年代) :ParNew + CMS (響應(yīng)時(shí)間優(yōu)先垃圾回收器)。
nohup java -Xmx4000m -Xms4000m -Xmn1500m -Xss256k -XX:MetaspaceSize=256m -XX:SurvivorRatio=8 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:gc.log -jar jshop-web-1.0-SNAPSHOT.jar --spring.config.addition-location=application.yaml > jshop.log 2>&1 &
顯式配置:parNew+CMS垃圾回收器組合:-XX:+UseParNewGC。
-XX:+UseConcMarkSweepGC。
說明:CMS只有再發(fā)生fullgc的時(shí)候才起到作用,CMS一般情況下不會(huì)發(fā)生;因此在jvm調(diào)優(yōu)原則中表示盡量防止發(fā)生fullgc; 因此CMS在JDK14被已經(jīng)被廢棄。
G1垃圾回收器是邏輯上分代模型,使用配置簡單。
nohup java -Xmx4000m -Xms4000m -Xmn1500m -Xss256k -XX:MetaspaceSize=256m -XX:SurvivorRatio=8 -XX:+UseG1GC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:gc.log -jar jshop-web-1.0-SNAPSHOT.jar --spring.config.addition-location=application.yaml > jshop.log 2>&1 &
經(jīng)過測試,發(fā)現(xiàn)g1 gc次數(shù)減少,由原來的28次減少為21次,但是gc總時(shí)長增加很多;時(shí)間增加,以為著服務(wù)性能就沒有提升上去。
三、數(shù)據(jù)庫連接池調(diào)優(yōu)思考
1、數(shù)據(jù)庫調(diào)優(yōu)動(dòng)機(jī)何在
(1)避免網(wǎng)頁出現(xiàn)錯(cuò)誤。
- Timeout 5xx 錯(cuò)誤。
- 慢查詢導(dǎo)致頁面無法加載。
- 阻塞導(dǎo)致數(shù)據(jù)無法提交。
(2)增加數(shù)據(jù)庫穩(wěn)定性。
- 很多的數(shù)據(jù)庫問題,都是由于低效的SQL語句造成的(寫SQL語句)。
(3)優(yōu)化用戶體驗(yàn)。
- 流暢的業(yè)務(wù)訪問體驗(yàn)。
- 良好的網(wǎng)站功能體驗(yàn)。
2、 影響數(shù)據(jù)庫性能的因素
1、低效的SQL語句。
2、并發(fā)cpu問題(SQL語句不支持多核心的cpu并發(fā)計(jì)算,也就是說一個(gè)SQL只能在一個(gè)cpu執(zhí)行結(jié)束)3、連接數(shù):max_connections。
4、超高cpu使用率。
5、磁盤io性能問題6、大表(字段多,數(shù)據(jù)多)。
7、大事務(wù)。
數(shù)據(jù)庫數(shù)據(jù)處理(困難):數(shù)據(jù)庫擴(kuò)容非常困難—想要通過擴(kuò)容提升數(shù)據(jù)庫性能Web服務(wù)器擴(kuò)容是非常簡單的。
web服務(wù)器是無狀態(tài)服務(wù),可以隨時(shí)進(jìn)行擴(kuò)容;但是數(shù)據(jù)庫不能隨意進(jìn)行擴(kuò)容,一旦擴(kuò)容就會(huì)影響數(shù)據(jù)完整性,數(shù)據(jù)一致性;項(xiàng)目架構(gòu)中提升性能:
1、對(duì)項(xiàng)目架構(gòu)、業(yè)務(wù),緩存各方面進(jìn)行優(yōu)化,真正數(shù)據(jù)庫請(qǐng)求比較少—減少數(shù)據(jù)庫壓力。
2、數(shù)據(jù)庫設(shè)計(jì),架構(gòu),優(yōu)化。
大多數(shù)企業(yè):數(shù)據(jù)庫采用主從架構(gòu)解決問題;數(shù)據(jù)分表,分庫,數(shù)據(jù)歸檔數(shù)據(jù),能熱分離。
3、連接池對(duì)性能樣例分析(詳細(xì)IP隱藏)
datasource:
#url: jdbc:mysql://127.0.0.1:3306/shop?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
url: jdbc:mysql://XX.XX.XX.XX:3306/shop?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&connectionTimeout=3000&socketTimeout=1200
網(wǎng)頁題目:基于互聯(lián)網(wǎng)架構(gòu)演進(jìn),構(gòu)建秒殺系統(tǒng)
網(wǎng)頁鏈接:http://www.dlmjj.cn/article/djecsjg.html


咨詢
建站咨詢

