柚子快報(bào)激活碼778899分享:微服務(wù)設(shè)計(jì)原則——高性能:池化
柚子快報(bào)激活碼778899分享:微服務(wù)設(shè)計(jì)原則——高性能:池化
文章目錄
1.池化由來(lái)2.內(nèi)存池3.線程池4.連接池5.對(duì)象池6.小結(jié)參考文獻(xiàn)
1.池化由來(lái)
池化(Pooling)是一種優(yōu)化技術(shù),旨在提高系統(tǒng)性能和資源利用率,特別是在高并發(fā)環(huán)境中。通過(guò)池化,系統(tǒng)可以重用資源,而不是每次都創(chuàng)建和銷毀這些資源。
池化的目的是完成資源復(fù)用,避免資源重復(fù)創(chuàng)建、銷毀來(lái)提高性能。
常見(jiàn)的池子有內(nèi)存池、連接池、線程池、對(duì)象池…
內(nèi)存、連接、線程、對(duì)象等都是資源,創(chuàng)建和銷毀這些資源都有一個(gè)特征, 那就是會(huì)涉及到很多系統(tǒng)調(diào)用或者網(wǎng)絡(luò) IO。 每次都在請(qǐng)求中去創(chuàng)建這些資源,會(huì)增加處理耗時(shí),但是如果我們用一個(gè) 容器(池) 把它們保存起來(lái),下次需要的時(shí)候,直接拿出來(lái)使用,避免重復(fù)創(chuàng)建和銷毀浪費(fèi)的時(shí)間。
2.內(nèi)存池
我們都知道,在 C/C++ 中分別使用 malloc/free 和 new/delete 進(jìn)行內(nèi)存的分配,其底層調(diào)用系統(tǒng)調(diào)用 sbrk/brk。頻繁的系統(tǒng)調(diào)用分配釋放內(nèi)存不但影響性能還容易造成內(nèi)存碎片,內(nèi)存池技術(shù)旨在解決這些問(wèn)題。正是這些原因,C/C++ 中的內(nèi)存操作并不是直接調(diào)用系統(tǒng)調(diào)用,而是已經(jīng)實(shí)現(xiàn)了自己的一套內(nèi)存管理,malloc 主要有三大實(shí)現(xiàn):
ptmalloc:glibc 的實(shí)現(xiàn)。tcmalloc:Google 的實(shí)現(xiàn)。jemalloc:Facebook 的實(shí)現(xiàn)。
雖然標(biāo)準(zhǔn)庫(kù)的實(shí)現(xiàn)在操作系統(tǒng)內(nèi)存管理的基礎(chǔ)上再加了一層內(nèi)存管理,但應(yīng)用程序通常也會(huì)實(shí)現(xiàn)自己特定的內(nèi)存池,如為了引用計(jì)數(shù)或者專門(mén)用于小對(duì)象分配。所以看起來(lái)內(nèi)存管理一般分為三個(gè)層次。
3.線程池
線程池是一個(gè)預(yù)先創(chuàng)建并維護(hù)一定數(shù)量線程的集合。當(dāng)有任務(wù)需要執(zhí)行時(shí),線程池會(huì)從池中取出一個(gè)空閑線程來(lái)執(zhí)行任務(wù),而不是每次都創(chuàng)建新線程。
線程創(chuàng)建是需要分配資源的,這存在一定的開(kāi)銷,如果一個(gè)任務(wù)就創(chuàng)建一個(gè)線程去處理,這必然會(huì)影響系統(tǒng)的性能。線程池的可以限制線程的創(chuàng)建數(shù)量并重復(fù)使用,從而提高系統(tǒng)的性能。
線程池可以分類或者分組,不同的任務(wù)使用不同的線程組,可以進(jìn)行隔離以免互相影響。對(duì)于分類,可以分為核心和非核心,核心線程池一直存在不會(huì)被回收,非核心可能對(duì)空閑一段時(shí)間后的線程進(jìn)行回收,從而節(jié)省系統(tǒng)資源,等需要時(shí)在按需創(chuàng)建放入池子中。
在 Java 中,可以使用 ExecutorService,在 Python 中可以使用 concurrent.futures.ThreadPoolExecutor。其他語(yǔ)言也有類似的線程池實(shí)現(xiàn)。
// Java 示例
ExecutorService executor = Executors.newFixedThreadPool(10);
executor.submit(() -> {
// 處理任務(wù)
});
4.連接池
常用的連接池有數(shù)據(jù)庫(kù)連接池、redis連接池、TCP連接池等等,其主要目的是通過(guò)復(fù)用來(lái)減少創(chuàng)建和釋放連接的開(kāi)銷。連接池實(shí)現(xiàn)通常需要考慮以下幾個(gè)問(wèn)題:
初始化:?jiǎn)?dòng)即初始化和惰性初始化。啟動(dòng)初始化可以減少一些加鎖操作和需要時(shí)可直接使用,缺點(diǎn)是可能造成服務(wù)啟動(dòng)緩慢或者啟動(dòng)后沒(méi)有任務(wù)處理,造成資源浪費(fèi)。惰性初始化是真正有需要的時(shí)候再去創(chuàng)建,這種方式可能有助于減少資源占用,但是如果面對(duì)突發(fā)的任務(wù)請(qǐng)求,然后瞬間去創(chuàng)建一堆連接,可能會(huì)造成系統(tǒng)響應(yīng)慢或者響應(yīng)失敗,通常我們會(huì)采用啟動(dòng)即初始化的方式。 連接數(shù)目:權(quán)衡所需的連接數(shù),連接數(shù)太少則可能造成任務(wù)處理緩慢,太多不但使任務(wù)處理慢還會(huì)過(guò)度消耗系統(tǒng)資源。 連接取出:當(dāng)連接池已經(jīng)無(wú)可用連接時(shí),是一直等待直到有可用連接還是分配一個(gè)新的臨時(shí)連接。 連接放入:當(dāng)連接使用完畢且連接池未滿時(shí),將連接放入連接池(包括連接池已經(jīng)無(wú)可用連接時(shí)創(chuàng)建的臨時(shí)連接),否則關(guān)閉。 連接檢測(cè):長(zhǎng)時(shí)間空閑連接和失效連接需要關(guān)閉并從連接池移除。常用的檢測(cè)方法有:使用時(shí)檢測(cè)和定期檢測(cè)。
5.對(duì)象池
嚴(yán)格來(lái)說(shuō),各種池都是對(duì)象池的的具體應(yīng)用,包括前面介紹的三種池。
對(duì)象池跟各種池一樣,也是緩存一些對(duì)象從而避免大量創(chuàng)建同一個(gè)類型的對(duì)象,同時(shí)限制了實(shí)例的個(gè)數(shù)。如 Redis 中 0-9999 整數(shù)對(duì)象就通過(guò)對(duì)象池進(jìn)行共享。在游戲開(kāi)發(fā)中對(duì)象池經(jīng)常使用,如進(jìn)入地圖時(shí)怪物和 NPC 的出現(xiàn)并不是每次都是重新創(chuàng)建,而是從對(duì)象池中取出。
在微服務(wù)中,使用對(duì)象池來(lái)管理緩存對(duì)象(如 Redis 緩存、內(nèi)存緩存),可以提高緩存的效率。
6.小結(jié)
池化技術(shù)在微服務(wù)架構(gòu)中通過(guò)提高資源的重用率,減少資源創(chuàng)建和銷毀的開(kāi)銷,顯著提升系統(tǒng)性能。線程池、連接池、對(duì)象池等技術(shù)可以有效管理并發(fā)任務(wù)和資源,提高系統(tǒng)的響應(yīng)速度和吞吐量。通過(guò)合理的池化策略和管理,微服務(wù)能夠更高效地處理高并發(fā)負(fù)載,優(yōu)化資源利用率。
參考文獻(xiàn)
服務(wù)高并發(fā)、高性能、高可用實(shí)現(xiàn)方案- 楊豈
柚子快報(bào)激活碼778899分享:微服務(wù)設(shè)計(jì)原則——高性能:池化
文章來(lái)源
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。