㈠ Mysql性能調優 – 你必須了解的15個重要變數
前言:
MYSQL 應該是最流行了 WEB 後端資料庫。雖然 NOSQL 最近越來越多的被提到,但是相信大部分架構師還是會選擇 MYSQL 來做數據存儲。本文作者總結梳理MySQL性能調優的15個重要變數,又不足需要補充的還望大佬指出。
1.DEFAULT_STORAGE_ENGINE
如果你已經在用MySQL 5.6或者5.7,並且你的數據表都是InnoDB,那麼表示你已經設置好了。如果沒有,確保把你的表轉換為InnoDB並且設置default_storage_engine為InnoDB。
為什麼?簡而言之,因為InnoDB是MySQL(包括Percona Server和MariaDB)最好的存儲引擎 – 它支持事務,高並發,有著非常好的性能表現(當配置正確時)。這里有詳細的版本介紹為什麼
2.INNODB_BUFFER_POOL_SIZE
這個是InnoDB最重要變數。實際上,如果你的主要存儲引擎是InnoDB,那麼對於你,這個變數對於MySQL是最重要的。
基本上,innodb_buffer_pool_size指定了MySQL應該分配給InnoDB緩沖池多少內存,InnoDB緩沖池用來存儲緩存的數據,二級索引,臟數據(已經被更改但沒有刷新到硬碟的數據)以及各種內部結構如自適應哈希索引。
根據經驗,在一個獨立的MySQL伺服器應該分配給MySQL整個機器總內存的80%。如果你的MySQL運行在一個共享伺服器,或者你想知道InnoDB緩沖池大小是否正確設置,詳細請看這里。
3.INNODB_LOG_FILE_SIZE
InnoDB重做日誌文件的設置在MySQL社區也叫做事務日誌。直到MySQL 5.6.8事務日誌默認值innodb_log_file_size=5M是唯一最大的InnoDB性能殺手。從MySQL 5.6.8開始,默認值提升到48M,但對於許多稍繁忙的系統,還遠遠要低。
根據經驗,你應該設置的日誌大小能在你伺服器繁忙時能存儲1-2小時的寫入量。如果不想這么麻煩,那麼設置1-2G的大小會讓你的性能有一個不錯的表現。這個變數也相當重要,更詳細的介紹請看這里。
當然,如果你有大量的大事務更改,那麼,更改比默認innodb日誌緩沖大小更大的值會對你的性能有一定的提高,但是你使用的是autocommit,或者你的事務更改小於幾k,那還是保持默認的值吧。
4.INNODB_FLUSH_LOG_AT_TRX_COMMIT
默認下,innodb_flush_log_at_trx_commit設置為1表示InnoDB在每次事務提交後立即刷新同步數據到硬碟。如果你使用autocommit,那麼你的每一個INSERT, UPDATE或DELETE語句都是一個事務提交。
同步是一個昂貴的操作(特別是當你沒有寫回緩存時),因為它涉及對硬碟的實際同步物理寫入。所以如果可能,並不建議使用默認值。
兩個可選的值是0和2:
* 0表示刷新到硬碟,但不同步(提交事務時沒有實際的IO操作)
* 2表示不刷新和不同步(也沒有實際的IO操作)
所以你如果設置它為0或2,則同步操作每秒執行一次。所以明顯的缺點是你可能會丟失上一秒的提交數據。具體來說,你的事務已經提交了,但伺服器馬上斷電了,那麼你的提交相當於沒有發生過。
顯示的,對於金融機構,如銀行,這是無法忍受的。不過對於大多數網站,可以設置為innodb_flush_log_at_trx_commit=0|2,即使伺服器最終崩潰也沒有什麼大問題。畢竟,僅僅在幾年前有許多網站還是用MyISAM,當崩潰時會丟失30s的數據(更不要提那令人抓狂的慢修復進程)。
那麼,0和2之間的實際區別是什麼?性能明顯的差異是可以忽略不計,因為刷新到操作系統緩存的操作是非常快的。所以很明顯應該設置為0,萬一MySQL崩潰(不是整個機器),你不會丟失任何數據,因為數據已經在OS緩存,最終還是會同步到硬碟的。
5.SYNC_BINLOG
已經有大量的文檔寫到sync_binlog,以及它和innodb_flush_log_at_trx_commit的關系,下面我們來簡單的介紹下:
a) 如果你的伺服器沒有設置從伺服器,而且你不做備份,那麼設置sync_binlog=0將對性能有好處。
b) 如果你有從伺服器並且做備份,但你不介意當主伺服器崩潰時在二進制日誌丟失一些事件,那麼為了更好的性能還是設置為sync_binlog=0.
c) 如果你有從伺服器並且備份,你非常在意從伺服器的一致性,以及能及時恢復到一個時間點(通過使用最新的一致性備份和二進制日誌將資料庫恢復到特定時間點的能力),那麼你應該設置innodb_flush_log_at_trx_commit=1,並且需要認真考慮使用sync_binlog=1。
問題是sync_binlog=1代價比較高 – 現在每個事務也要同步一次到硬碟。你可能會想為什麼不把兩次同步合並成一次,想法正確 – 新版本的MySQL(5.6和5.7,MariaDB和Percona Server)已經能合並提交,那麼在這種情況下sync_binlog=1的操作也不是這么昂貴了,但在舊的mysql版本中仍然會對性能有很大影響。
6.INNODB_FLUSH_METHOD
將innodb_flush_method設置為O_DIRECT以避免雙重緩沖.唯一一種情況你不應該使用O_DIRECT是當你操作系統不支持時。但如果你運行的是Linux,使用O_DIRECT來激活直接IO。
不用直接IO,雙重緩沖將會發生,因為所有的資料庫更改首先會寫入到OS緩存然後才同步到硬碟 – 所以InnoDB緩沖池和OS緩存會同時持有一份相同的數據。特別是如果你的緩沖池限制為總內存的50%,那意味著在寫密集的環境中你可能會浪費高達50%的內存。如果沒有限制為50%,伺服器可能由於OS緩存的高壓力會使用到swap。
簡單地說,設置為innodb_flush_method=O_DIRECT。
7.INNODB_BUFFER_POOL_INSTANCES
MySQL 5.5引入了緩沖實例作為減小內部鎖爭用來提高MySQL吞吐量的手段。
在5.5版本這個對提升吞吐量幫助很小,然後在MySQL 5.6版本這個提升就非常大了,所以在MySQL5.5中你可能會保守地設置innodb_buffer_pool_instances=4,在MySQL 5.6和5.7中你可以設置為8-16個緩沖池實例。
你設置後觀察會覺得性能提高不大,但在大多數高負載情況下,它應該會有不錯的表現。
對了,不要指望這個設置能減少你單個查詢的響應時間。這個是在高並發負載的伺服器上才看得出區別。比如多個線程同時做許多事情。
8.INNODB_THREAD_CONCURRENCY
InnoDB有一種方法來控制並行執行的線程數 – 我們稱為並發控制機制。大部分是由innodb_thread_concurrency值來控制的。如果設置為0,並發控制就關閉了,因此InnoDB會立即處理所有進來的請求(盡可能多的)。
在你有32CPU核心且只有4個請求時會沒什麼問題。不過想像下你只有4CPU核心和32個請求時 – 如果你讓32個請求同時處理,你這個自找麻煩。因為這些32個請求只有4 CPU核心,顯然地會比平常慢至少8倍(實際上是大於8倍),而然這些請求每個都有自己的外部和內部鎖,這有很大可能堆積請求。
下面介紹如何更改這個變數,在mysql命令行提示符執行:
對於大多數工作負載和伺服器,設置為8是一個好開端,然後你可以根據伺服器達到了這個限制而資源使用率利用不足時逐漸增加。可以通過show engine innodb statusG來查看目前查詢處理情況,查找類似如下行:
9.SKIP_NAME_RESOLVE
這一項不得不提及,因為仍然有很多人沒有添加這一項。你應該添加skip_name_resolve來避免連接時DNS解析。
大多數情況下你更改這個會沒有什麼感覺,因為大多數情況下DNS伺服器解析會非常快。不過當DNS伺服器失敗時,它會出現在你伺服器上出現「unauthenticated connections」 ,而就是為什麼所有的請求都突然開始慢下來了。
所以不要等到這種事情發生才更改。現在添加這個變數並且避免基於主機名的授權。
10.INNODB_IO_CAPACITY, INNODB_IO_CAPACITY_MAX
* innodb_io_capacity:用來當刷新臟數據時,控制MySQL每秒執行的寫IO量。
* innodb_io_capacity_max: 在壓力下,控制當刷新臟數據時MySQL每秒執行的寫IO量
首先,這與讀取無關 – SELECT查詢執行的操作。對於讀操作,MySQL會盡最大可能處理並返回結果。至於寫操作,MySQL在後台會循環刷新,在每一個循環會檢查有多少數據需要刷新,並且不會用超過innodb_io_capacity指定的數來做刷新操作。這也包括更改緩沖區合並(在它們刷新到磁碟之前,更改緩沖區是輔助臟頁存儲的關鍵)。
第二,我需要解釋一下什麼叫「在壓力下」,MySQL中稱為」緊急情況」,是當MySQL在後台刷新時,它需要刷新一些數據為了讓新的寫操作進來。然後,MySQL會用到innodb_io_capacity_max。
那麼,應該設置innodb_io_capacity和innodb_io_capacity_max為什麼呢?
最好的方法是測量你的存儲設置的隨機寫吞吐量,然後給innodb_io_capacity_max設置為你的設備能達到的最大IOPS。innodb_io_capacity就設置為它的50-75%,特別是你的系統主要是寫操作時。
通常你可以預測你的系統的IOPS是多少。例如由8 15k硬碟組成的RAID10能做大約每秒1000隨機寫操作,所以你可以設置innodb_io_capacity=600和innodb_io_capacity_max=1000。許多廉價企業SSD可以做4,000-10,000 IOPS等。
這個值設置得不完美問題不大。但是,要注意默認的200和400會限制你的寫吞吐量,因此你可能偶爾會捕捉到刷新進程。如果出現這種情況,可能是已經達到你硬碟的寫IO吞吐量,或者這個值設置得太小限制了吞吐量。
11.INNODB_STATS_ON_METADATA
如果你跑的是MySQL 5.6或5.7,你不需要更改innodb_stats_on_metadata的默認值,因為它已經設置正確了。
不過在MySQL 5.5或5.1,強烈建議關閉這個變數 – 如果是開啟,像命令show table status會立即查詢INFORMATION_SCHEMA而不是等幾秒再執行,這會使用到額外的IO操作。
從5.1.32版本開始,這個是動態變數,意味著你不需要重啟MySQL伺服器來關閉它。
12.INNODB_BUFFER_POOL_DUMP_AT_SHUTDOWN & INNODB_BUFFER_POOL_LOAD_AT_STARTUP
innodb_buffer_pool_mp_at_shutdown和innodb_buffer_pool_load_at_startup這兩個變數與性能無關,不過如果你偶爾重啟mysql伺服器(如生效配置),那麼就有關。當兩個都激活時,MySQL緩沖池的內容(更具體地說,是緩存頁)在停止MySQL時存儲到一個文件。當你下次啟動MySQL時,它會在後台啟動一個線程來載入緩沖池的內容以提高預熱速度到3-5倍。
兩件事:
第一,它實際上沒有在關閉時復制緩沖池內容到文件,僅僅是復製表空間ID和頁面ID – 足夠的信息來定位硬碟上的頁面了。然後它就能以大量的順序讀非常快速的載入那些頁面,而不是需要成千上萬的小隨機讀。
第二,啟動時是在後台載入內容,因為MySQL不需要等到緩沖池內容載入完成再開始接受請求(所以看起來不會有什麼影響)。
從MySQL 5.7.7開始,默認只有25%的緩沖池頁面在mysql關閉時存儲到文件,但是你可以控制這個值 – 使用innodb_buffer_pool_mp_pct,建議75-100。
這個特性從MySQL 5.6才開始支持。
13.INNODB_ADAPTIVE_HASH_INDEX_PARTS
如果你運行著一個大量SELECT查詢的MySQL伺服器(並且已經盡可能優化),那麼自適應哈希索引將下你的下一個瓶頸。自適應哈希索引是InnoDB內部維護的動態索引,可以提高最常用的查詢模式的性能。這個特性可以重啟伺服器關閉,不過默認下在mysql的所有版本開啟。
這個技術非常復雜,在大多數情況下它會對大多數類型的查詢直到加速的作用。不過,當你有太多的查詢往資料庫,在某一個點上它會花過多的時間等待AHI鎖和閂鎖。
如果你的是MySQL 5.7,沒有這個問題 – innodb_adaptive_hash_index_parts默認設置為8,所以自適應哈希索引被切割為8個分區,因為不存在全局互斥。
不過在mysql 5.7前的版本,沒有AHI分區數量的控制。換句話說,有一個全局互斥鎖來保護AHI,可能導致你的select查詢經常撞牆。
所以如果你運行的是5.1或5.6,並且有大量的select查詢,最簡單的方案就是切換成同一版本的Percona Server來激活AHI分區。
14.QUERY_CACHE_TYPE
如果人認為查詢緩存效果很好,肯定應該使用它。好吧,有時候是有用的。不過這個只在你在低負載時有用,特別是在低負載下大多數是讀取,小量寫或者沒有。
如果是那樣的情況,設置query_cache_type=ON和query_cache_size=256M就好了。不過記住不能把256M設置更高的值了,否則會由於查詢緩存失效時,導致引起嚴重的伺服器停頓。
如果你的MySQL伺服器高負載動作,建議設置query_cache_size=0和query_cache_type=OFF,並重啟伺服器生效。那樣Mysql就會停止在所有的查詢使用查詢緩存互斥鎖。
15.TABLE_OPEN_CACHE_INSTANCES
從MySQL 5.6.6開始,表緩存能分割到多個分區。
表緩存用來存放目前已打開表的列表,當每一個表打開或關閉互斥體就被鎖定 – 即使這是一個隱式臨時表。使用多個分區絕對減少了潛在的爭用。
從MySQL 5.7.8開始,table_open_cache_instances=16是默認的配置。
歡迎做Java的工程師朋友們私信我資料免費獲取免費的Java架構學習資料(裡面有高可用、高並發、高性能及分布式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)
其中覆蓋了互聯網的方方面面,期間碰到各種產品各種場景下的各種問題,很值得大家借鑒和學習,擴展自己的技術廣度和知識面。
㈡ 高並發,你真的理解透徹了嗎
高並發,幾乎是每個程序員都想擁有的經驗。原因很簡單:隨著流量變大,會遇到各種各樣的技術問題,比如介面響應超時、CPU load升高、GC頻繁、死鎖、大數據量存儲等等,這些問題能推動我們在技術深度上不斷精進。
在過往的面試中,如果候選人做過高並發的項目,我通常會讓對方談談對於高並發的理解,但是能系統性地回答好此問題的人並不多。
大概分成這樣幾類:
1、對數據化的指標沒有概念 :不清楚選擇什麼樣的指標來衡量高並發系統?分不清並發量和QPS,甚至不知道自己系統的總用戶量、活躍用戶量,平峰和高峰時的QPS和TPS等關鍵數據。
3、理解片面,把高並發設計等同於性能優化 :大談並發編程、多級緩存、非同步化、水平擴容,卻忽視高可用設計、服務治理和運維保障。
4、掌握大方案,卻忽視最基本的東西 :能講清楚垂直分層、水平分區、緩存等大思路,卻沒意識去分析數據結構是否合理,演算法是否高效,沒想過從最根本的IO和計算兩個維度去做細節優化。
這篇文章,我想結合自己的高並發項目經驗,系統性地總結下高並發需要掌握的知識和實踐思路,希望對你有所幫助。內容分成以下3個部分:
高並發意味著大流量,需要運用技術手段抵抗流量的沖擊,這些手段好比操作流量,能讓流量更平穩地被系統所處理,帶給用戶更好的體驗。
我們常見的高並發場景有:淘寶的雙11、春運時的搶票、微博大V的熱點新聞等。除了這些典型事情,每秒幾十萬請求的秒殺系統、每天千萬級的訂單系統、每天億級日活的信息流系統等,都可以歸為高並發。
很顯然,上面談到的高並發場景,並發量各不相同, 那到底多大並發才算高並發呢?
1、不能只看數字,要看具體的業務場景。不能說10W QPS的秒殺是高並發,而1W QPS的信息流就不是高並發。信息流場景涉及復雜的推薦模型和各種人工策略,它的業務邏輯可能比秒殺場景復雜10倍不止。因此,不在同一個維度,沒有任何比較意義。
2、業務都是從0到1做起來的,並發量和QPS只是參考指標,最重要的是:在業務量逐漸變成原來的10倍、100倍的過程中,你是否用到了高並發的處理方法去演進你的系統,從架構設計、編碼實現、甚至產品方案等維度去預防和解決高並發引起的問題?而不是一味的升級硬體、加機器做水平擴展。
此外,各個高並發場景的業務特點完全不同:有讀多寫少的信息流場景、有讀多寫多的交易場景, 那是否有通用的技術方案解決不同場景的高並發問題呢?
我覺得大的思路可以借鑒,別人的方案也可以參考,但是真正落地過程中,細節上還會有無數的坑。另外,由於軟硬體環境、技術棧、以及產品邏輯都沒法做到完全一致,這些都會導致同樣的業務場景,就算用相同的技術方案也會面臨不同的問題,這些坑還得一個個趟。
因此,這篇文章我會將重點放在基礎知識、通用思路、和我曾經實踐過的有效經驗上,希望讓你對高並發有更深的理解。
先搞清楚高並發系統設計的目標,在此基礎上再討論設計方案和實踐經驗才有意義和針對性。
高並發絕不意味著只追求高性能,這是很多人片面的理解。從宏觀角度看,高並發系統設計的目標有三個:高性能、高可用,以及高可擴展。
1、高性能:性能體現了系統的並行處理能力,在有限的硬體投入下,提高性能意味著節省成本。同時,性能也反映了用戶體驗,響應時間分別是100毫秒和1秒,給用戶的感受是完全不同的。
2、高可用:表示系統可以正常服務的時間。一個全年不停機、無故障;另一個隔三差五齣線上事故、宕機,用戶肯定選擇前者。另外,如果系統只能做到90%可用,也會大大拖累業務。
3、高擴展:表示系統的擴展能力,流量高峰時能否在短時間內完成擴容,更平穩地承接峰值流量,比如雙11活動、明星離婚等熱點事件。
這3個目標是需要通盤考慮的,因為它們互相關聯、甚至也會相互影響。
比如說:考慮系統的擴展能力,你會將服務設計成無狀態的,這種集群設計保證了高擴展性,其實也間接提升了系統的性能和可用性。
再比如說:為了保證可用性,通常會對服務介面進行超時設置,以防大量線程阻塞在慢請求上造成系統雪崩,那超時時間設置成多少合理呢?一般,我們會參考依賴服務的性能表現進行設置。
再從微觀角度來看,高性能、高可用和高擴展又有哪些具體的指標來衡量?為什麼會選擇這些指標呢?
2.2.1 性能指標
通過性能指標可以度量目前存在的性能問題,同時作為性能優化的評估依據。一般來說,會採用一段時間內的介面響應時間作為指標。
1、平均響應時間:最常用,但是缺陷很明顯,對於慢請求不敏感。比如1萬次請求,其中9900次是1ms,100次是100ms,則平均響應時間為1.99ms,雖然平均耗時僅增加了0.99ms,但是1%請求的響應時間已經增加了100倍。
2、TP90、TP99等分位值:將響應時間按照從小到大排序,TP90表示排在第90分位的響應時間, 分位值越大,對慢請求越敏感。
3、吞吐量:和響應時間呈反比,比如響應時間是1ms,則吞吐量為每秒1000次。
通常,設定性能目標時會兼顧吞吐量和響應時間,比如這樣表述:在每秒1萬次請求下,AVG控制在50ms以下,TP99控制在100ms以下。對於高並發系統,AVG和TP分位值必須同時要考慮。
另外,從用戶體驗角度來看,200毫秒被認為是第一個分界點,用戶感覺不到延遲,1秒是第二個分界點,用戶能感受到延遲,但是可以接受。
因此,對於一個 健康 的高並發系統,TP99應該控制在200毫秒以內,TP999或者TP9999應該控制在1秒以內。
2.2.2 可用性指標
高可用性是指系統具有較高的無故障運行能力,可用性 = 正常運行時間 / 系統總運行時間,一般使用幾個9來描述系統的可用性。
對於高並發系統來說,最基本的要求是:保證3個9或者4個9。原因很簡單,如果你只能做到2個9,意味著有1%的故障時間,像一些大公司每年動輒千億以上的GMV或者收入,1%就是10億級別的業務影響。
2.2.3 可擴展性指標
面對突發流量,不可能臨時改造架構,最快的方式就是增加機器來線性提高系統的處理能力。
對於業務集群或者基礎組件來說,擴展性 = 性能提升比例 / 機器增加比例,理想的擴展能力是:資源增加幾倍,性能提升幾倍。通常來說,擴展能力要維持在70%以上。
但是從高並發系統的整體架構角度來看,擴展的目標不僅僅是把服務設計成無狀態就行了,因為當流量增加10倍,業務服務可以快速擴容10倍,但是資料庫可能就成為了新的瓶頸。
像MySQL這種有狀態的存儲服務通常是擴展的技術難點,如果架構上沒提前做好規劃(垂直和水平拆分),就會涉及到大量數據的遷移。
因此,高擴展性需要考慮:服務集群、資料庫、緩存和消息隊列等中間件、負載均衡、帶寬、依賴的第三方等,當並發達到某一個量級後,上述每個因素都可能成為擴展的瓶頸點。
了解了高並發設計的3大目標後,再系統性總結下高並發的設計方案,會從以下兩部分展開:先總結下通用的設計方法,然後再圍繞高性能、高可用、高擴展分別給出具體的實踐方案。
通用的設計方法主要是從「縱向」和「橫向」兩個維度出發,俗稱高並發處理的兩板斧:縱向擴展和橫向擴展。
3.1.1 縱向擴展(scale-up)
它的目標是提升單機的處理能力,方案又包括:
1、提升單機的硬體性能:通過增加內存、 CPU核數、存儲容量、或者將磁碟 升級成SSD 等堆硬體的方式來提升。
2、提升單機的軟體性能:使用緩存減少IO次數,使用並發或者非同步的方式增加吞吐量。
3.1.2 橫向擴展(scale-out)
因為單機性能總會存在極限,所以最終還需要引入橫向擴展,通過集群部署以進一步提高並發處理能力,又包括以下2個方向:
1、做好分層架構:這是橫向擴展的提前,因為高並發系統往往業務復雜,通過分層處理可以簡化復雜問題,更容易做到橫向擴展。
上面這種圖是互聯網最常見的分層架構,當然真實的高並發系統架構會在此基礎上進一步完善。比如會做動靜分離並引入CDN,反向代理層可以是LVS+Nginx,Web層可以是統一的API網關,業務服務層可進一步按垂直業務做微服務化,存儲層可以是各種異構資料庫。
2、各層進行水平擴展:無狀態水平擴容,有狀態做分片路由。業務集群通常能設計成無狀態的,而資料庫和緩存往往是有狀態的,因此需要設計分區鍵做好存儲分片,當然也可以通過主從同步、讀寫分離的方案提升讀性能。
下面再結合我的個人經驗,針對高性能、高可用、高擴展3個方面,總結下可落地的實踐方案。
3.2.1 高性能的實踐方案
1、集群部署,通過負載均衡減輕單機壓力。
2、多級緩存,包括靜態數據使用CDN、本地緩存、分布式緩存等,以及對緩存場景中的熱點key、緩存穿透、緩存並發、數據一致性等問題的處理。
3、分庫分表和索引優化,以及藉助搜索引擎解決復雜查詢問題。
4、考慮NoSQL資料庫的使用,比如HBase、TiDB等,但是團隊必須熟悉這些組件,且有較強的運維能力。
5、非同步化,將次要流程通過多線程、MQ、甚至延時任務進行非同步處理。
6、限流,需要先考慮業務是否允許限流(比如秒殺場景是允許的),包括前端限流、Nginx接入層的限流、服務端的限流。
7、對流量進行 削峰填谷 ,通過 MQ承接流量。
8、並發處理,通過多線程將串列邏輯並行化。
9、預計算,比如搶紅包場景,可以提前計算好紅包金額緩存起來,發紅包時直接使用即可。
10、 緩存預熱 ,通過非同步 任務 提前 預熱數據到本地緩存或者分布式緩存中。
11、減少IO次數,比如資料庫和緩存的批量讀寫、RPC的批量介面支持、或者通過冗餘數據的方式幹掉RPC調用。
12、減少IO時的數據包大小,包括採用輕量級的通信協議、合適的數據結構、去掉介面中的多餘欄位、減少緩存key的大小、壓縮緩存value等。
13、程序邏輯優化,比如將大概率阻斷執行流程的判斷邏輯前置、For循環的計算邏輯優化,或者採用更高效的演算法。
14、各種池化技術的使用和池大小的設置,包括HTTP請求池、線程池(考慮CPU密集型還是IO密集型設置核心參數)、資料庫和Redis連接池等。
15、JVM優化,包括新生代和老年代的大小、GC演算法的選擇等,盡可能減少GC頻率和耗時。
16、鎖選擇,讀多寫少的場景用樂觀鎖,或者考慮通過分段鎖的方式減少鎖沖突。
上述方案無外乎從計算和 IO 兩個維度考慮所有可能的優化點,需要有配套的監控系統實時了解當前的性能表現,並支撐你進行性能瓶頸分析,然後再遵循二八原則,抓主要矛盾進行優化。
3.2.2 高可用的實踐方案
1、對等節點的故障轉移,Nginx和服務治理框架均支持一個節點失敗後訪問另一個節點。
2、非對等節點的故障轉移,通過心跳檢測並實施主備切換(比如redis的哨兵模式或者集群模式、MySQL的主從切換等)。
3、介面層面的超時設置、重試策略和冪等設計。
4、降級處理:保證核心服務,犧牲非核心服務,必要時進行熔斷;或者核心鏈路出問題時,有備選鏈路。
5、限流處理:對超過系統處理能力的請求直接拒絕或者返回錯誤碼。
6、MQ場景的消息可靠性保證,包括procer端的重試機制、broker側的持久化、consumer端的ack機制等。
7、灰度發布,能支持按機器維度進行小流量部署,觀察系統日誌和業務指標,等運行平穩後再推全量。
8、監控報警:全方位的監控體系,包括最基礎的CPU、內存、磁碟、網路的監控,以及Web伺服器、JVM、資料庫、各類中間件的監控和業務指標的監控。
9、災備演練:類似當前的「混沌工程」,對系統進行一些破壞性手段,觀察局部故障是否會引起可用性問題。
高可用的方案主要從冗餘、取捨、系統運維3個方向考慮,同時需要有配套的值班機制和故障處理流程,當出現線上問題時,可及時跟進處理。
3.2.3 高擴展的實踐方案
1、合理的分層架構:比如上面談到的互聯網最常見的分層架構,另外還能進一步按照數據訪問層、業務邏輯層對微服務做更細粒度的分層(但是需要評估性能,會存在網路多一跳的情況)。
2、存儲層的拆分:按照業務維度做垂直拆分、按照數據特徵維度進一步做水平拆分(分庫分表)。
3、業務層的拆分:最常見的是按照業務維度拆(比如電商場景的商品服務、訂單服務等),也可以按照核心介面和非核心介面拆,還可以按照請求源拆(比如To C和To B,APP和H5 )。
高並發確實是一個復雜且系統性的問題,由於篇幅有限,諸如分布式Trace、全鏈路壓測、柔性事務都是要考慮的技術點。另外,如果業務場景不同,高並發的落地方案也會存在差異,但是總體的設計思路和可借鑒的方案基本類似。
高並發設計同樣要秉承架構設計的3個原則:簡單、合適和演進。"過早的優化是萬惡之源",不能脫離業務的實際情況,更不要過度設計,合適的方案就是最完美的。
作者簡介:985碩士,前亞馬遜工程師,現大廠技術管理者。
㈢ 肯德基redis未找到卡並集的緩存
摘要 緩存雪崩
㈣ 全順新時代如何安裝預熱閥
安裝方法是:
開始確定預熱器的固定位置至少比水箱蓋低20-40厘米。確定串聯「發動機放氣孔、暖風管、小循環管」的位置選擇安裝方式,切斷暖風管。用切口較低的軟管連接並鎖定預熱器的進水口。慢慢添加冷卻液,直到冷卻液流出預熱器出口。將預熱器出水口與切斷的軟管連接,並鎖緊軟管。將冷卻液加註至規定量,並檢查是否有泄漏。啟動汽車發動機,將管路中的氣體完全排出,並補充冷卻液至標准量。打開220v電源,做好測試工作。電源指示燈為紅色,工作燈為綠色。電源接通後,兩個燈同時亮,預熱器輕微振動。同時,預熱器加熱腔的外殼會略熱。當發動機達到40-50度的起動溫度時,綠燈熄滅,預熱完成。
熱電膨脹閥是為了適應計算機控制而開發的一種製冷自控元件。
㈤ 卷閘門遙控器鎖著了怎麼開
1、如果是四鍵遙控器,一般是上下停鎖,再按一次鎖鍵就可以解鎖。有些遙控器有單獨的解鎖鍵的,就是帶這一個開鎖標志的鍵,假如果沒有,就是帶鎖的鍵同時有鎖定和解鎖的功能,按一次加鎖,再按一次就是解鎖。
2、叫專業師傅去幫你,控制器可以清碼的。清碼後原有的遙控器全部失效。再把手上現有的遙控器重新配碼。
(5)緩存預熱加鎖擴展閱讀:
一、使用遠程遙控啟動車輛,一般都在50米的范圍之內,超過了適用范圍,車輛的防盜、遙控、車窗控制等都不會起作用!
二、車輛在被遠程啟動之後,車門因為安全的考慮處於鎖閉狀態,而車窗自然也全部升起,車內的空氣不流通,所以車主在進入車內之前,還需要開車門等一會,讓渾濁暖氣清一清。
三、一般啟動預熱最多不超過廠家限定的十分鍾,而且次數也不宜超過兩次,因為車輛開始工作時狀態較涼,加上室外環境溫度較低等原因,遠程啟動後,發動機由於燃燒不充分產生的廢氣會給三元帶來很大負擔,長期以往會損壞三元催化器。
㈥ 吉利繽瑞熱車時怎麼鎖車
通過車輛的遙控器來進行鎖定,遙控器上面有鎖車按鍵,通過車輛主駕駛門板上的鎖車按鍵來鎖住車輛。這兩種方式都可以將機動車輛鎖住,讓中控鎖工作,確保車輛安全。車輛的車門鎖可以有效的保護機動車輛內部的物品安全,保證機動車輛的安全。
冬天熱車介紹
汽車啟動30秒到一分鍾就可以上路,此時千萬不要高速駕駛,要維持低速,不要超過2000轉,低速駕駛過程中觀察水溫表,假如略有上升,可以適當加擋前進,當駕駛一公里左右時,汽車已經完全預熱之後,就可以正常駕駛。
特別提醒:一定要正確把握熱車時間,不正確的熱車技巧會大大降低車子的使用壽命,有的小夥伴,熱車時間不清楚要熱多久,一上來就熱很長時間,這樣做會使得汽車產生積碳,這樣引起的損傷,跟不熱車直接踩油門起步對車引起的損傷,是一樣的。
在機動車輛停放的時候,需要通過遙控器將車輛鎖定,或者是通過車鑰匙的無鑰匙進入系統,將車輛鎖定,才可以有效地起到保護作用,防止機動車輛出現被盜的問題,使用是非常方便的。
㈦ 什麼是CDN 域名預熱
以下可做參考:通常大家理解的預熱功能是,
緩存預熱。將需要預熱的資源推送到CDN邊緣節點,
用戶訪問時將不需要再回源站,可以直接命中緩存。
這樣可以加快資源的首次訪問,
同時緩解突增回源流量給源站造成的壓力。
這里說的是域名預熱。顧名思義,
就是把域名准備好、推送到LDNS,
以加快域名的首次訪問。
㈧ 汽車駐車預熱器好用嗎能用幾年
這個用個三五年還是沒問題的。
汽車預熱器的安裝方法具體如下;
1、首先確定預熱器固定位置至少低與水箱蓋20-40厘米;
2、確定串聯的位置《發動機放水孔,暖風管,小循環管》;
3、選擇確定安裝方式,將暖風管割斷;
4、將預熱器進水口與割斷較低的膠管連接並鎖緊;
5、慢慢添加防凍液,直到預熱器出水口有防凍液流出;
6、將預熱器出水口與割斷的膠管連接並鎖緊膠管;
7、加滿防凍液至標准量,檢查有無泄漏;
8、發動汽車發動機使管路中氣體完全排出,補充防凍液至標准量;
9、接通220V電源,進行試驗,電源指示燈為紅色,工作燈為綠色,電源接通後兩燈同時亮,預熱器有輕微振動,同時預熱器加熱腔殼體有微熱,當發動機達到啟動的溫度40度-50度時,綠燈熄滅預熱完成。
㈨ 天龍375雷諾發動機進氣預熱鎖死影響動力嗎
一、不預熱啟動導致發動機動力不足
1、很多車主都有一個共同的體會,那就是在嚴冬之下,經過一夜後再開動車輛,發現車輛就像「吃不飽」一樣缺乏動力。此外,久而久之,還很容易造成車輛積碳增多。其實,這是由於冬季開車未經預熱所導致的。
2、在冬天,發動機經過一夜靜置後,各磨擦面上的潤滑油殘余壓力早已消失,失去油膜保護,低溫使潤滑油的黏度大大增加,附著力和流動性變差。這個時候,啟動發動機的運動阻力大大增加,啟動時超過60%的功率都用於克服運動阻力。
3、除此之外,未經預熱就馬上起步,發動機會由於混合比不均勻,導致輸出動力不足;低溫時,霧化不充分的燃油不能充分燃燒,容易形成積碳;部分汽油沒有霧化,會沿缸壁直接流入曲軸箱與機油混合,降低機油品質。
4、正常的發動機預熱暖車,不僅可以發揮發動機的正常動力,還能延長發動機壽命。其實,發動機在冷啟動時的磨損量與其它工況下的磨損量大體相同。通常,發動機在冷啟動時的磨損量,占整個磨損量的一半左右。這個時候預熱可減少這種磨損。低溫下,金屬會呈現較小的彈性和抗磨性,只有在工作溫度下,發動機才能達到正常的配合間隙,保持最佳工作狀態。
二、發動機預熱不是越久越好
同時,發動機預熱並不是持續越久越好。首先,長時間熱車,發動機做無用功,浪費燃料還不利於環保。一般情況下,中低檔車以能夠正常怠速運轉,水溫70 80 為宜。正常怠速下,化油器發動機在推回阻風門以後運行平穩;電噴發動機從快怠速狀態的1200rpm降至800rpm,司機只需看轉速表正常就可以走車了。還要注意的是,預熱期間不可猛踏油門,不要讓發動機轉速過高。
三、發動機預熱多久啟動才好
水溫表指針剛開始動,或者啟動後發動機轉速表回落至怠速狀態就可以行駛,耗時大約一分鍾左右。建議車主啟動後前2公里先低速行駛,然後再正常提速即可。
當前,雖然中山未出現冰凍天氣,但頻繁的雨水天氣常常導致路面濕滑。因此,專家還特別建議,冬季行車上路時,一定要勻速行駛,切忌猛加油、狠減速,輕柔加油、緩慢減速是冬季行車的原則。在濕滑路面上行車時,盡可能保持直線行走,不要頻繁換道,盡量在路中間沿車轍走。在濕滑路面上起步及中低速行駛時,最好選擇高一擋的擋位,以免驅動力過大造成打滑。換擋還要勤,要像駕駛磨合期的車那樣,注意擋位的選擇和油離配合。
四、發動機預熱的好處
發動機預熱可以增長發動機的使用壽命
一般來說,發動機經過一夜的靜置,各磨擦面上的潤滑油殘余壓力早已消失,失去油膜保護;低溫使潤滑油的粘度大大增加,附著力和流動性變差。
此時,啟動發動機的運動阻力大大增加,啟動時超過60%的功率都用於克服冷機的運動阻力。權威的研究成果表明,冷機需要預熱。
發動機在冷啟動時的磨損量與其他工況下的磨損量大體相同。換句話說,發 動機在冷啟動時的磨損量占整個磨損量的一半左右。正常的怠速暖車可以減少這種磨損,延長發動機的使用壽命。
低溫下,金屬會呈現較小的彈性和抗磨性;只有在工作溫度下,發動機才能達到正常的配合間隙,保持最佳工作狀態。低溫啟動發動機後,隨即起步走車。由於混合比不均勻,發動機輸出動力不足;低溫時,霧化不充分的燃油不能充分燃燒,容易形成積碳;部分汽油沒有霧化,會沿缸壁直接流入曲軸箱與機油混合,降低機油品質。
但熱車的時間並非越長越好。長時間熱車,發動機做無用功、浪費燃料還不利於環保。一般情況下,中低檔車以能夠正常怠速運轉為宜。正常怠速從快怠速狀態的1200rpm降至800rpm,只需看轉速表正常就可以走車了。
預熱不僅是發動機,變速箱也需要預熱。冷機狀態下,應避免多次啟動,因為多次啟動會加劇運動部件的磨損程度,降低機件乃至發動機的整體工作壽命。
五、發動機預熱的注意事項
1, 無論是電噴柴油發動機還是直噴柴油發動機都是需要預熱的。
因為發動機預熱的目的不僅僅是讓燃油充分燃燒,防凍液溫度上升,它還具有使得潤滑油形成保護膜的作用。而有些柴油發動機的預熱裝置對潤滑油形成保護膜方面還是有著一定的局限性的。
2, 發動機預熱時間並不是越長越好。
如果長時間熱車,那麼柴油發動機就會做無用功,這樣不僅浪費了燃料而且不利於環保。一般在柴油發動機開始進行有負荷工作前預熱3-5分鍾是比較合適的。
3, 冷機狀態下盡量避免多次啟動。
柴油發動機多次啟動會加劇運動部件的磨損程度,降低機件及發動機的使用壽命。據權威研究證明,發動機超過50%的磨損是由於冷啟動造成的,所以減少冷啟動的次數會延長發動機的使用壽命。
4, 在發動機預熱的時候應檢查發動機相關部件和運行情況是否正常。
在發動機預熱的時候,應該查看儀錶板上的指示燈是否正常,應該聽一聽發動機是否有異響,查看發動機冒煙是否正常。
5,看轉速表判斷怠速是否正常。
一般情況下,機手只需要看轉速表是否正常即可判斷機器預熱是否完成。
㈩ 汽車水箱預熱器的安裝方法
1、預熱器位置要低於引擎冷卻液的最低位,預熱器的進水口要比引擎的出水口低;
2、進出水軟管要盡量要短;
3、進出水軟管不能過度彎曲;
4、注意要排盡系統中的空氣;
5、通電之後,要隨時留意預熱器及出水軟管的溫度變化;
6、一段時間後,進出水管應該都熱(進水溫度稍低);
7、安裝前將發動機冷卻液全部排空;
8、重新注入冷卻液後,啟動引擎大約十分鍾,以便充分消除空氣。
(10)緩存預熱加鎖擴展閱讀:
(1)先封閉後開放的原則。主要是在封閉狀態下動用空氣炮處理,如果空氣炮無效再考慮其他措施;
(2)先疏通後捅堵的原則。首先疏通下部通道,為涌堵的物料找到去向,為後續清堵打下基礎;
(3)先原因後結果的原則。這里的原因指造成堵塞的直接原因,指卡堵的異物或結皮的根部,往往也是疏通下部的必要;
(4)先容易後難題的原則。當堵塞的集聚料較多、甚至燒結結塊時,難以一捅就通,首先要清理靠近通道的物料和容易清除的邊際料。