最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java page cache回寫(xiě)機(jī)制案例詳解

 更新時(shí)間:2021年09月11日 09:38:51   作者:JAVA探索  
這篇文章主要介紹了Java page cache回寫(xiě)機(jī)制案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

JAVA寫(xiě)文件的基本流程

在不使用堆外內(nèi)存的情況下,java在寫(xiě)文件時(shí),先將字節(jié)寫(xiě)入JVM的堆內(nèi)內(nèi)存中;然后調(diào)用jvm的寫(xiě)文件函數(shù),將字節(jié)寫(xiě)入jvm的堆外內(nèi)存中,jvm再調(diào)用系統(tǒng)內(nèi)核的寫(xiě)文件函數(shù),將字節(jié)寫(xiě)入內(nèi)核的heap中;然后內(nèi)核將字節(jié)寫(xiě)入page cache中,將page cache狀態(tài)改為dirty,根據(jù)page cache的回寫(xiě)機(jī)制在合適的時(shí)機(jī)將字節(jié)寫(xiě)入磁盤(pán)。

page cache 自動(dòng)回寫(xiě)機(jī)制

page cache的回寫(xiě)時(shí)機(jī)由系統(tǒng)配置/etc/sysctl.conf 中的幾個(gè)參數(shù)決定,分別是:

  • dirty_background_bytes

默認(rèn)值:0  表示不啟用

當(dāng)臟頁(yè)所占的內(nèi)存大小超過(guò)dirty_background_bytes時(shí),內(nèi)核的pdflush線程會(huì)從后臺(tái)開(kāi)始回寫(xiě)臟頁(yè),不會(huì)影響應(yīng)用程序的后序IO操作。

  • dirty_background_ratio   

默認(rèn)值 :10

參數(shù)意義:當(dāng)臟頁(yè)所占的百分比(相對(duì)于所有可用內(nèi)存,即空閑內(nèi)存頁(yè)+可回收內(nèi)存頁(yè))達(dá)到dirty_background_ratio時(shí)內(nèi)核的pdflush線程從后臺(tái)開(kāi)始回寫(xiě)臟頁(yè),不會(huì)影響應(yīng)用程序的后序IO操作。增大會(huì)使用更多內(nèi)存用于緩沖,可以提高系統(tǒng)的讀寫(xiě)性能。當(dāng)需要持續(xù)、恒定的寫(xiě)入場(chǎng)合時(shí),應(yīng)該降低該數(shù)值。

注意:dirty_background_bytes參數(shù)和dirty_background_ratio參數(shù)是相對(duì)的,只能指定其中一個(gè)。當(dāng)其中一個(gè)參數(shù)文件被寫(xiě)入時(shí),會(huì)立即開(kāi)始計(jì)算臟頁(yè)限制,并且會(huì)將另一個(gè)參數(shù)的值清零。

  • dirty_bytes

默認(rèn)值:0  表示不啟用

當(dāng)臟頁(yè)所占的內(nèi)存數(shù)量達(dá)到dirty_bytes時(shí),內(nèi)核將臟頁(yè)中的數(shù)據(jù)刷入磁盤(pán)并阻塞后序的IO操作。

 注意:dirty_bytes參數(shù)和dirty_ratio參數(shù)是相對(duì)的,只能指定其中一個(gè)。當(dāng)其中一個(gè)參數(shù)文件被寫(xiě)入時(shí),會(huì)立即開(kāi)始計(jì)算臟頁(yè)限制,并且會(huì)將另一個(gè)參數(shù)的值清零

  • dirty_ratio

默認(rèn)值:20

參數(shù)意義:當(dāng)臟頁(yè)所占的百分比(相對(duì)于所有可用內(nèi)存,即空閑內(nèi)存頁(yè)+可回收內(nèi)存頁(yè))達(dá)到dirty_ratio時(shí),內(nèi)核將臟頁(yè)中的數(shù)據(jù)刷入磁盤(pán)并阻塞后序的IO操作。

  • dirty_background_ratio與dirty_ratio比較

dirty_ratio是屬于強(qiáng)制性的回寫(xiě),也就是說(shuō)當(dāng)一個(gè)內(nèi)存區(qū)的臟頁(yè)達(dá)到這個(gè)比例時(shí)就會(huì)觸發(fā)內(nèi)核內(nèi)存管理把臟頁(yè)強(qiáng)制回寫(xiě)的流程,但dirty_background_ratio是屬于軟性的行為,因?yàn)檫@是透過(guò)pdflush內(nèi)核線程進(jìn)行的流程,可以在后臺(tái)執(zhí)行對(duì)這些臟頁(yè)面回寫(xiě),并不會(huì)因此影響到當(dāng)下正在執(zhí)行中的過(guò)程。 所以看Linux內(nèi)核中預(yù)設(shè)的比例是臟頁(yè)達(dá)到5%的比例時(shí)就會(huì)先透過(guò)pdflush內(nèi)核線程進(jìn)行回寫(xiě),當(dāng)臟頁(yè)達(dá)到10%比例時(shí),就等于是一個(gè)很?chē)?yán)重的狀況,此時(shí)就會(huì)在平衡臟頁(yè)面流程中觸發(fā)強(qiáng)制的回寫(xiě),讓系統(tǒng)可以回復(fù)到原本預(yù)設(shè)合理的狀態(tài)。

  • dirty_expire_centisecs

默認(rèn)值:3000

參數(shù)意義:用來(lái)指定臟數(shù)據(jù)能存活的時(shí)間。指定的值是按100算做一秒計(jì)算。只有當(dāng)超過(guò)這個(gè)值后,才會(huì)被內(nèi)核進(jìn)程pdflush寫(xiě)到磁盤(pán)。

  • dirty_writeback_centisecs

默認(rèn)值:500

參數(shù)意義:pdflush回寫(xiě)的頻率,每次的喚醒的間隔,是以數(shù)字100算做1秒。如果將這項(xiàng)值設(shè)為500就相當(dāng)5秒喚醒pdflush進(jìn)程。如果將這項(xiàng)值設(shè)為0就表示完全禁止定期回寫(xiě)數(shù)據(jù)。

  • drop_caches

向/proc/sys/vm/drop_caches文件中寫(xiě)入數(shù)值可以使內(nèi)核釋放page cache,dentries和inodes緩存所占的內(nèi)存。

  只釋放pagecache:

echo 1 > /proc/sys/vm/drop_caches

  只釋放dentries和inodes緩存:

echo 2 > /proc/sys/vm/drop_caches

  釋放pagecache、dentries和inodes緩存:

echo 3 > /proc/sys/vm/drop_caches

  這個(gè)操作不是破壞性操作,臟的對(duì)象(比如臟頁(yè))不會(huì)被釋放,因此要首先運(yùn)行sync命令。

注:這個(gè)只能是手動(dòng)釋放

測(cè)試

采用javaBIO不斷向一個(gè)文件寫(xiě)入數(shù)據(jù),通過(guò)pcstat觀察page cache的大小。文件初始狀態(tài):

[root@node01 ~]# ll test.txt && pcstat test.txt 
-rw-r--r--. 1 root root 0 Aug  1 19:58 test.txt
+----------+----------------+------------+-----------+---------+
| Name     | Size (bytes)   | Pages      | Cached    | Percent |
|----------+----------------+------------+-----------+---------|
| test.txt | 0              | 0          | 0         |     NaN |
+----------+----------------+------------+-----------+---------+

dirty_background_bytes測(cè)試

將臟頁(yè)閾值設(shè)置為10MB,臟頁(yè)存活時(shí)間設(shè)置為5000s,當(dāng)臟頁(yè)大小不足10MB時(shí),絕對(duì)不會(huì)被刷入磁盤(pán),當(dāng)臟頁(yè)大小超過(guò)10MB,但是存活時(shí)間不超過(guò)5000s時(shí),滿(mǎn)足dirty_background_bytes的條件,被刷入磁盤(pán)。

#修改系統(tǒng)配置
[root@node01 ~]# vi /etc/sysctl.conf
...
#便于測(cè)試,設(shè)為10485760  10mb 
vm.dirty_background_bytes = 10485760
#便于測(cè)試,設(shè)為104857600  100mb 
vm.dirty_bytes = 104857600
#便于測(cè)試,設(shè)為500000  5000s
vm.dirty_writeback_centisecs = 500000
#便于測(cè)試,設(shè)為30000 5min
vm.dirty_expire_centisecs = 30000
 
#加載系統(tǒng)配置
[root@node01 ~]# sysctl -p
 
 

當(dāng)page cache大小超過(guò)10mb前,停止寫(xiě)入,關(guān)閉電源,重啟設(shè)備。

關(guān)機(jī)前page cache狀態(tài)及文件大小。

[root@node01 ~]# ll -h test.txt && pcstat test.txt 
-rw-r--r--. 1 root root 1.7K Aug  1 20:20 test.txt
+----------+----------------+------------+-----------+---------+
| Name     | Size (bytes)   | Pages      | Cached    | Percent |
|----------+----------------+------------+-----------+---------|
| test.txt | 1660           | 1          | 1         | 100.000 |
+----------+----------------+------------+-----------+---------+

掐斷電源,重啟。(注意,這里不能按正常流程重啟電源)

重啟后page cache狀態(tài)及文件大小。

[root@node01 ~]# ll -h test.txt && pcstat test.txt 
-rw-r--r--. 1 root root 0 Aug  1 20:20 test.txt
+----------+----------------+------------+-----------+---------+
| Name     | Size (bytes)   | Pages      | Cached    | Percent |
|----------+----------------+------------+-----------+---------|
| test.txt | 0              | 0          | 0         |     NaN |
+----------+----------------+------------+-----------+---------+

之前寫(xiě)入的數(shù)據(jù)全部丟失,由于沒(méi)有達(dá)到后臺(tái)自動(dòng)刷入磁盤(pán)的閾值(dirty_background_bytes),page cache內(nèi)的數(shù)據(jù)丟失。

當(dāng)page cache大小超過(guò)10mb后,停止寫(xiě)入,關(guān)閉電源,重啟設(shè)備。

關(guān)機(jī)前page cache狀態(tài)及文件大小。

[root@node01 ~]# ll -h test.txt && pcstat test.txt 
-rw-r--r--. 1 root root 37M Aug  1 20:26 test.txt
+----------+----------------+------------+-----------+---------+
| Name     | Size (bytes)   | Pages      | Cached    | Percent |
|----------+----------------+------------+-----------+---------|
| test.txt | 37985420       | 9274       | 9274      | 100.000 |
+----------+----------------+------------+-----------+---------+

掐斷電源,重啟。(注意,這里不能按正常流程重啟電源)

重啟后page cache狀態(tài)及文件大小。

[root@node01 ~]#  ll -h test.txt && pcstat test.txt 
-rw-r--r--. 1 root root 30M Aug  1 20:26 test.txt
+----------+----------------+------------+-----------+---------+
| Name     | Size (bytes)   | Pages      | Cached    | Percent |
|----------+----------------+------------+-----------+---------|
| test.txt | 31035392       | 7577       | 0         | 000.000 |
+----------+----------------+------------+-----------+---------+

之前寫(xiě)入的數(shù)據(jù)部分丟失,每次達(dá)到后臺(tái)自動(dòng)刷入磁盤(pán)的閾值(dirty_background_bytes)時(shí)內(nèi)核都會(huì)進(jìn)行一次刷入操作,而沒(méi)有達(dá)到閾值的部分就會(huì)丟失。關(guān)機(jī)前37M,關(guān)機(jī)后30M,自動(dòng)刷入閾值設(shè)置為10M,37-10=7M,這7M數(shù)據(jù)沒(méi)有被刷入磁盤(pán),重啟后丟失。

dirty_expire_centisecs測(cè)試

將臟頁(yè)閾值設(shè)置為100MB,檢測(cè)頻率設(shè)置為1s,臟頁(yè)存活時(shí)間設(shè)置為15s。這樣可以達(dá)到這樣一個(gè)測(cè)試目的,當(dāng)我的page cache大小未到達(dá)100MB時(shí),由于超過(guò)了存活時(shí)間15s,檢測(cè)的又很及時(shí),幾乎可以被全部刷入磁盤(pán)。為什么說(shuō)幾乎呢?因?yàn)椴还茉趺礃?,靠檢測(cè)頻率自動(dòng)刷入機(jī)制終究會(huì)丟失檢測(cè)真空期的數(shù)據(jù)。臟頁(yè)在每次刷入磁盤(pán)后重寫(xiě)前都是干凈的狀態(tài)。

#修改系統(tǒng)配置
[root@node01 ~]# vi /etc/sysctl.conf
...
#便于測(cè)試,設(shè)為104857600  100mb 
vm.dirty_background_bytes = 104857600
#便于測(cè)試,設(shè)為104857600  100mb 
vm.dirty_bytes = 104857600
#便于測(cè)試,設(shè)為1500  15s
vm.dirty_writeback_centisecs = 1500
#便于測(cè)試,設(shè)為100 1s
vm.dirty_expire_centisecs = 100
 
#加載系統(tǒng)配置
[root@node01 ~]# sysctl -p
 
 

當(dāng)page cache大小超過(guò)100mb前,停止寫(xiě)入,未超過(guò)15s,關(guān)閉電源,重啟設(shè)備。

關(guān)機(jī)前page cache狀態(tài)及文件大小。

-rw-r--r--. 1 root root 150 Aug  1 20:44 test.txt
+----------+----------------+------------+-----------+---------+
| Name     | Size (bytes)   | Pages      | Cached    | Percent |
|----------+----------------+------------+-----------+---------|
| test.txt | 150            | 1          | 1         | 100.000 |
+----------+----------------+------------+-----------+---------+

掐斷電源,重啟。(注意,這里不能按正常流程重啟電源)

重啟后page cache狀態(tài)及文件大小。

[root@node01 ~]# ll -h test.txt && pcstat test.txt 
-rw-r--r--. 1 root root 0 Aug  1 20:44 test.txt
+----------+----------------+------------+-----------+---------+
| Name     | Size (bytes)   | Pages      | Cached    | Percent |
|----------+----------------+------------+-----------+---------|
| test.txt | 0              | 0          | 0         |     NaN |
+----------+----------------+------------+-----------+---------+

之前寫(xiě)入的數(shù)據(jù)全部丟失,由于沒(méi)有超過(guò)臟頁(yè)存活時(shí)間,page cache內(nèi)的數(shù)據(jù)丟失。

當(dāng)page cache存活超過(guò)15s后,關(guān)閉電源,重啟設(shè)備。

關(guān)機(jī)前page cache狀態(tài)及文件大小。

[root@node01 ~]# ll -h test.txt && pcstat test.txt 
-rw-r--r--. 1 root root 1.7K Aug  1 20:48 test.txt
+----------+----------------+------------+-----------+---------+
| Name     | Size (bytes)   | Pages      | Cached    | Percent |
|----------+----------------+------------+-----------+---------|
| test.txt | 1680           | 1          | 1         | 100.000 |
+----------+----------------+------------+-----------+---------+

掐斷電源,重啟。(注意,這里不能按正常流程重啟電源)

重啟后page cache狀態(tài)及文件大小。

[root@node01 ~]# ll -h test.txt && pcstat test.txt 
-rw-r--r--. 1 root root 1.7K Aug  1 20:48 test.txt
+----------+----------------+------------+-----------+---------+
| Name     | Size (bytes)   | Pages      | Cached    | Percent |
|----------+----------------+------------+-----------+---------|
| test.txt | 1680           | 1          | 1         | 100.000 |
+----------+----------------+------------+-----------+---------+
 

超過(guò)15s且被檢測(cè)到的數(shù)據(jù)全部保留

dirty_writeback_centisecs測(cè)試

將臟頁(yè)閾值設(shè)置為100MB,檢測(cè)頻率設(shè)置為15s,臟頁(yè)存活時(shí)間設(shè)置為1s。這樣可以達(dá)到這樣一個(gè)測(cè)試目的,當(dāng)我的page cache大小未到達(dá)100MB時(shí),且超過(guò)了存活時(shí)間1s,由于檢測(cè)的不及時(shí),導(dǎo)致超過(guò)存活時(shí)間的數(shù)據(jù)還是沒(méi)有被刷入磁盤(pán)。

#修改系統(tǒng)配置
[root@node01 ~]# vi /etc/sysctl.conf
...
#便于測(cè)試,設(shè)為104857600  100mb 
vm.dirty_background_bytes = 104857600
#便于測(cè)試,設(shè)為104857600  100mb 
vm.dirty_bytes = 104857600
#便于測(cè)試,設(shè)為100  1s
vm.dirty_writeback_centisecs = 100
#便于測(cè)試,設(shè)為1500 15s
vm.dirty_expire_centisecs = 1500
 
#加載系統(tǒng)配置
[root@node01 ~]# sysctl -p
 
 

當(dāng)page cache大小超過(guò)100mb前,停止寫(xiě)入,未超過(guò)15s,關(guān)閉電源,重啟設(shè)備。

關(guān)機(jī)前page cache狀態(tài)及文件大小。

[root@node01 ~]# ll -h test.txt && pcstat test.txt
-rw-r--r--. 1 root root 550 Aug  1 21:02 test.txt
+----------+----------------+------------+-----------+---------+
| Name     | Size (bytes)   | Pages      | Cached    | Percent |
|----------+----------------+------------+-----------+---------|
| test.txt | 550            | 1          | 1         | 100.000 |
+----------+----------------+------------+-----------+---------+

掐斷電源,重啟。(注意,這里不能按正常流程重啟電源)

重啟后page cache狀態(tài)及文件大小。

[root@node01 ~]#  ll -h test.txt && pcstat test.txt
-rw-r--r--. 1 root root 0 Aug  1 21:04 test.txt
+----------+----------------+------------+-----------+---------+
| Name     | Size (bytes)   | Pages      | Cached    | Percent |
|----------+----------------+------------+-----------+---------|
| test.txt | 0              | 0          | 0         |     NaN |
+----------+----------------+------------+-----------+---------+

之前寫(xiě)入的數(shù)據(jù)全部丟失,雖然超過(guò)臟頁(yè)存活時(shí)間,但是沒(méi)有到檢測(cè)時(shí)間,page cache內(nèi)的數(shù)據(jù)丟失。

到此這篇關(guān)于Java page cache回寫(xiě)機(jī)制案例詳解的文章就介紹到這了,更多相關(guān)Java page cache回寫(xiě)機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MyBatis 引入映射器的方法

    MyBatis 引入映射器的方法

    本文通過(guò)實(shí)例代碼給大家分享mybatis 引入映射器的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-09-09
  • Maven打包SpringBoot工程的實(shí)現(xiàn)示例

    Maven打包SpringBoot工程的實(shí)現(xiàn)示例

    在使用Spring Boot和Maven的項(xiàng)目中,你可以使用Maven來(lái)打包你的項(xiàng)目,本文主要介紹了Maven打包SpringBoot工程的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • 解決spring-boot 打成jar包后 啟動(dòng)時(shí)指定參數(shù)無(wú)效的問(wèn)題

    解決spring-boot 打成jar包后 啟動(dòng)時(shí)指定參數(shù)無(wú)效的問(wèn)題

    這篇文章主要介紹了解決spring-boot 打成jar包后 啟動(dòng)時(shí)指定參數(shù)無(wú)效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • java中使用interrupt通知線程停止詳析

    java中使用interrupt通知線程停止詳析

    這篇文章主要介紹了java中使用interrupt通知線程停止詳析,文章介紹的是使用interrupt來(lái)通知線程停止運(yùn)行,而不是強(qiáng)制停止,詳細(xì)內(nèi)容需要的小伙伴可以參考一下
    2022-09-09
  • springboot開(kāi)啟mybatis駝峰命名自動(dòng)映射的三種方式

    springboot開(kāi)啟mybatis駝峰命名自動(dòng)映射的三種方式

    這篇文章給大家總結(jié)springboot開(kāi)啟mybatis駝峰命名自動(dòng)映射的三種方式,文章并通過(guò)代碼示例給大家介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-02-02
  • maven下載依賴(lài)失敗問(wèn)題及解決

    maven下載依賴(lài)失敗問(wèn)題及解決

    這篇文章主要介紹了maven下載依賴(lài)失敗問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • SpringBoot訪問(wèn)請(qǐng)求404解決方法

    SpringBoot訪問(wèn)請(qǐng)求404解決方法

    這篇文章主要介紹了SpringBoot訪問(wèn)請(qǐng)求404解決方法,文中有詳細(xì)的解決方法供大家參考,對(duì)我們學(xué)習(xí)或工作有一定的幫助,需要的朋友跟著小編一起來(lái)學(xué)習(xí)吧
    2023-07-07
  • 利用Java Set 去除重復(fù)object的方法

    利用Java Set 去除重復(fù)object的方法

    下面小編就為大家?guī)?lái)一篇利用Java Set 去除重復(fù)object的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • java 注解的基礎(chǔ)詳細(xì)介紹

    java 注解的基礎(chǔ)詳細(xì)介紹

    這篇文章主要介紹了java 注解的基礎(chǔ)詳細(xì)介紹的相關(guān)資料,希望通過(guò)本文大家能掌握注解的使用方法,需要的朋友可以參考下
    2017-09-09
  • Java中字符序列的替換與分解的幾種實(shí)現(xiàn)方法

    Java中字符序列的替換與分解的幾種實(shí)現(xiàn)方法

    本文主要介紹了Java中字符序列的替換與分解的幾種實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02

最新評(píng)論

临泽县| 同心县| 化隆| 桦南县| 西安市| 珠海市| 新绛县| 扶沟县| 南昌市| 革吉县| 永年县| 长兴县| 富宁县| 镇宁| 南漳县| 马山县| 陕西省| 阿拉尔市| 内黄县| 通江县| 宣汉县| 新龙县| 如东县| 甘德县| 康定县| 化德县| 临猗县| 双桥区| 沅陵县| 茌平县| 杭锦旗| 平安县| 南溪县| 满洲里市| 灯塔市| 甘德县| 鹰潭市| 乡宁县| 绥阳县| 长白| 修武县|