欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java page cache回寫機制案例詳解

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

JAVA寫文件的基本流程

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

page cache 自動回寫機制

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

  • dirty_background_bytes

默認值:0  表示不啟用

當臟頁所占的內(nèi)存大小超過dirty_background_bytes時,內(nèi)核的pdflush線程會從后臺開始回寫臟頁,不會影響應(yīng)用程序的后序IO操作。

  • dirty_background_ratio   

默認值 :10

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

注意:dirty_background_bytes參數(shù)和dirty_background_ratio參數(shù)是相對的,只能指定其中一個。當其中一個參數(shù)文件被寫入時,會立即開始計算臟頁限制,并且會將另一個參數(shù)的值清零。

  • dirty_bytes

默認值:0  表示不啟用

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

 注意:dirty_bytes參數(shù)和dirty_ratio參數(shù)是相對的,只能指定其中一個。當其中一個參數(shù)文件被寫入時,會立即開始計算臟頁限制,并且會將另一個參數(shù)的值清零

  • dirty_ratio

默認值:20

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

  • dirty_background_ratio與dirty_ratio比較

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

  • dirty_expire_centisecs

默認值:3000

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

  • dirty_writeback_centisecs

默認值:500

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

  • drop_caches

向/proc/sys/vm/drop_caches文件中寫入數(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

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

注:這個只能是手動釋放

測試

采用javaBIO不斷向一個文件寫入數(shù)據(jù),通過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測試

將臟頁閾值設(shè)置為10MB,臟頁存活時間設(shè)置為5000s,當臟頁大小不足10MB時,絕對不會被刷入磁盤,當臟頁大小超過10MB,但是存活時間不超過5000s時,滿足dirty_background_bytes的條件,被刷入磁盤。

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

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

關(guān)機前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 |
+----------+----------------+------------+-----------+---------+

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

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

關(guān)機前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 |
+----------+----------------+------------+-----------+---------+

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

dirty_expire_centisecs測試

將臟頁閾值設(shè)置為100MB,檢測頻率設(shè)置為1s,臟頁存活時間設(shè)置為15s。這樣可以達到這樣一個測試目的,當我的page cache大小未到達100MB時,由于超過了存活時間15s,檢測的又很及時,幾乎可以被全部刷入磁盤。為什么說幾乎呢?因為不管怎么樣,靠檢測頻率自動刷入機制終究會丟失檢測真空期的數(shù)據(jù)。臟頁在每次刷入磁盤后重寫前都是干凈的狀態(tài)。

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

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

關(guān)機前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 |
+----------+----------------+------------+-----------+---------+

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

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

關(guān)機前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 |
+----------+----------------+------------+-----------+---------+
 

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

dirty_writeback_centisecs測試

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

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

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

關(guān)機前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 |
+----------+----------------+------------+-----------+---------+

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

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

相關(guān)文章

  • Java使用easypoi快速導(dǎo)入導(dǎo)出的實現(xiàn)

    Java使用easypoi快速導(dǎo)入導(dǎo)出的實現(xiàn)

    這篇文章主要介紹了實現(xiàn)Java使用easypoi快速導(dǎo)入導(dǎo)出的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • IDEA配置MAVEN本地倉庫的實現(xiàn)步驟

    IDEA配置MAVEN本地倉庫的實現(xiàn)步驟

    本文主要介紹了IDEA配置MAVEN本地倉庫的實現(xiàn)步驟,將詳細介紹如何配置Maven環(huán)境變量,Maven配置文件,可以輕松地設(shè)置和配置MAVEN本地倉庫,以便在IDEA中享受更高效的開發(fā)體驗
    2023-08-08
  • IDEA 2021版新建Maven、TomCat工程的詳細教程

    IDEA 2021版新建Maven、TomCat工程的詳細教程

    這篇文章主要介紹了IDEA 2021版新建Maven、TomCat工程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • 詳解java中import的作用

    詳解java中import的作用

    這篇文章主要介紹了java中import作用,import與package機制相關(guān),這里先從package入手,再講述import以及static import的作用。
    2021-04-04
  • Java經(jīng)典排序算法之二分插入排序詳解

    Java經(jīng)典排序算法之二分插入排序詳解

    這篇文章主要為大家詳細介紹了Java經(jīng)典排序算法之二分插入排序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • 導(dǎo)入maven項目各個注解均報錯的解決方案

    導(dǎo)入maven項目各個注解均報錯的解決方案

    這篇文章主要介紹了導(dǎo)入maven項目各個注解均報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 創(chuàng)建SpringBoot工程并集成Mybatis的方法

    創(chuàng)建SpringBoot工程并集成Mybatis的方法

    這篇文章主要介紹了創(chuàng)建SpringBoot工程并集成Mybatis,需要的朋友可以參考下
    2018-06-06
  • 下一代Eclipse 步入云端

    下一代Eclipse 步入云端

    代號Che的下一代Eclipse IDE將運行在云端,可以在任何機器上打開瀏覽器寫代碼。項目的建立、編輯、debug、部署可以都在一個倉庫中進行,需要的朋友可以參考下
    2015-12-12
  • Java模擬服務(wù)器解析web數(shù)據(jù)

    Java模擬服務(wù)器解析web數(shù)據(jù)

    本篇文章主要給大家詳細分享了搭建JavaWeb服務(wù)器的詳細步驟以及用到的代碼,對此有需要的朋友可以跟著學(xué)習下,希望能給你帶來幫助
    2021-07-07
  • java?JVM-clinit指令實現(xiàn)原理面試精講

    java?JVM-clinit指令實現(xiàn)原理面試精講

    這篇文章主要介紹了java?JVM-clinit指令實現(xiàn)原理面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10

最新評論