精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Linux文件讀寫機制及優化方式

運維 系統運維
本文只討論Linux下文件的讀寫機制,不涉及不同讀取方式如read,fread,cin等的對比,這些讀取方式本質上都是調用系統api read,只是做了不同封裝。

[[171781]]

本文只討論Linux下文件的讀寫機制,不涉及不同讀取方式如read,fread,cin等的對比,這些讀取方式本質上都是調用系統api read,只是做了不同封裝。以下所有測試均使用open, read, write這一套系統api

緩存

緩存是用來減少高速設備訪問低速設備所需平均時間的組件,文件讀寫涉及到計算機內存和磁盤,內存操作速度遠遠大于磁盤,如果每次調用read,write都去直接操作磁盤,一方面速度會被限制,一方面也會降低磁盤使用壽命,因此不管是對磁盤的讀操作還是寫操作,操作系統都會將數據緩存起來

Page Cache

頁緩存(Page Cache)是位于內存和文件之間的緩沖區,它實際上也是一塊內存區域,所有的文件IO(包括網絡文件)都是直接和頁緩存交互,操作系統通過一系列的數據結構,比如inode, address_space, struct page,實現將一個文件映射到頁的級別,這些具體數據結構及之間的關系我們暫且不討論,只需知道頁緩存的存在以及它在文件IO中扮演著重要角色,很大一部分程度上,文件讀寫的優化就是對頁緩存使用的優化

Dirty Page

頁緩存對應文件中的一塊區域,如果頁緩存和對應的文件區域內容不一致,則該頁緩存叫做臟頁(Dirty Page)。對頁緩存進行修改或者新建頁緩存,只要沒有刷磁盤,都會產生臟頁

查看頁緩存大小

linux上有兩種方式查看頁緩存大小,一種是free命令

  1. $ free 
  2.              total       used       free     shared    buffers     cached 
  3. Mem:      20470840    1973416   18497424        164     270208    1202864 
  4. -/+ buffers/cache:     500344   19970496 
  5. Swap:            0          0          0 

cached那一列就是頁緩存大小,單位Byte

另一種是直接查看/proc/meminfo,這里我們只關注兩個字段

  1. Cached:          1202872 kB 
  2. Dirty:                52 kB 

Cached是頁緩存大小,Dirty是臟頁大小

臟頁回寫參數

Linux有一些參數可以改變操作系統對臟頁的回寫行為

  1. $ sysctl -a 2>/dev/null | grep dirty 
  2. vm.dirty_background_ratio = 10 
  3. vm.dirty_background_bytes = 0 
  4. vm.dirty_ratio = 20 
  5. vm.dirty_bytes = 0 
  6. vm.dirty_writeback_centisecs = 500 
  7. vm.dirty_expire_centisecs = 3000 

vm.dirty_background_ratio是內存可以填充臟頁的百分比,當臟頁總大小達到這個比例后,系統后臺進程就會開始將臟頁刷磁盤(vm.dirty_background_bytes類似,只不過是通過字節數來設置)

vm.dirty_ratio是絕對的臟數據限制,內存里的臟數據百分比不能超過這個值。如果臟數據超過這個數量,新的IO請求將會被阻擋,直到臟數據被寫進磁盤

vm.dirty_writeback_centisecs指定多長時間做一次臟數據寫回操作,單位為百分之一秒

vm.dirty_expire_centisecs指定臟數據能存活的時間,單位為百分之一秒,比如這里設置為30秒,在操作系統進行寫回操作時,如果臟數據在內存中超過30秒時,就會被寫回磁盤

這些參數可以通過 sudo sysctl -w vm.dirty_background_ratio=5 這樣的命令來修改,需要root權限,也可以在root用戶下執行 echo 5 > /proc/sys/vm/dirty_background_ratio 來修改

文件讀寫流程

在有了頁緩存和臟頁的概念后,我們再來看文件的讀寫流程

讀文件

  • 用戶發起read操作
  • 操作系統查找頁緩存
  • 若未***,則產生缺頁異常,然后創建頁緩存,并從磁盤讀取相應頁填充頁緩存
  • 若***,則直接從頁緩存返回要讀取的內容
  • 用戶read調用完成

寫文件

  • 用戶發起write操作
  • 操作系統查找頁緩存
  • 若未***,則產生缺頁異常,然后創建頁緩存,將用戶傳入的內容寫入頁緩存
  • 若***,則直接將用戶傳入的內容寫入頁緩存
  • 用戶write調用完成
  • 頁被修改后成為臟頁,操作系統有兩種機制將臟頁寫回磁盤
  • 用戶手動調用fsync()
  • 由pdflush進程定時將臟頁寫回磁盤

頁緩存和磁盤文件是有對應關系的,這種關系由操作系統維護,對頁緩存的讀寫操作是在內核態完成,對用戶來說是透明的

文件讀寫的優化思路

不同的優化方案適應于不同的使用場景,比如文件大小,讀寫頻次等,這里我們不考慮修改系統參數的方案,修改系統參數總是有得有失,需要選擇一個平衡點,這和業務相關度太高,比如是否要求數據的強一致性,是否容忍數據丟失等等。優化的思路有以下兩個考慮點

1.***化利用頁緩存

2.減少系統api調用次數

***點很容易理解,盡量讓每次IO操作都***頁緩存,這比操作磁盤會快很多,第二點提到的系統api主要是read和write,由于系統調用會從用戶態進入內核態,并且有些還伴隨這內存數據的拷貝,因此在有些場景下減少系統調用也會提高性能

readahead

readahead是一種非阻塞的系統調用,它會觸發操作系統將文件內容預讀到頁緩存中,并且立馬返回,函數原型如下

  1. ssize_t readahead(int fd, off64_t offset, size_t count); 

在通常情況下,調用readahead后立馬調用read并不會提高讀取速度,我們通常在批量讀取或在讀取之前一段時間調用readahead,假設如下場景,我們需要連續讀取1000個1M的文件,有如下兩個方案,偽代碼如下

直接調用read函數

  1. char* buf = (char*)malloc(10*1024*1024); 
  2. for (int i = 0; i < 1000; ++i) 
  3.     int fd = open_file(); 
  4.     int size = stat_file_size(); 
  5.     read(fd, buf, size); 
  6.     // do something with buf 
  7.     close(fd); 

先批量調用readahead再調用read

  1. int* fds = (int*)malloc(sizeof(int)*1000); 
  2. int* fd_size = (int*)malloc(sizeof(int)*1000); 
  3. for (int i = 0; i < 1000; ++i) 
  4.     int fd = open_file(); 
  5.     int size = stat_file_size(); 
  6.     readahead(fd, 0, size); 
  7.     fds[i] = fd; 
  8.     fd_size[i] = size; 
  9. char* buf = (char*)malloc(10*1024*1024); 
  10. for (int i = 0; i < 1000; ++i) 
  11.     read(fds[i], buf, fd_size[i]); 
  12.     // do something with buf 
  13.     close(fds[i]); 

感興趣的可以寫代碼實際測試一下,需要注意的是在測試前必須先回寫臟頁和清空頁緩存,執行如下命令

  1. sync && sudo sysctl -w vm.drop_caches=3 

可通過查看/proc/meminfo中的Cached及Dirty項確認是否生效

通過測試發現,第二種方法比***種讀取速度大約提高10%-20%,這種場景下是批量執行readahead后立馬執行read,優化空間有限,如果有一種場景可以在read之前一段時間調用readahead,那將大大提高read本身的讀取速度

這種方案實際上是利用了操作系統的頁緩存,即提前觸發操作系統將文件讀取到頁緩存,并且操作系統對缺頁處理、緩存***、緩存淘汰都由一套完善的機制,雖然用戶也可以針對自己的數據做緩存管理,但和直接使用頁緩存比并沒有多大差別,而且會增加維護代價

mmap

mmap是一種內存映射文件的方法,即將一個文件或者其它對象映射到進程的地址空間,實現文件磁盤地址和進程虛擬地址空間中一段虛擬地址的一一對映關系,函數原型如下

  1. void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); 

實現這樣的映射關系后,進程就可以采用指針的方式讀寫操作這一段內存,而系統會自動回寫臟頁面到對應的文件磁盤上,即完成了對文件的操作而不必再調用read,write等系統調用函數。如下圖所示

 

 

mmap除了可以減少read,write等系統調用以外,還可以減少內存的拷貝次數,比如在read調用時,一個完整的流程是操作系統讀磁盤文件到頁緩存,再從頁緩存將數據拷貝到read傳遞的buffer里,而如果使用mmap之后,操作系統只需要將磁盤讀到頁緩存,然后用戶就可以直接通過指針的方式操作mmap映射的內存,減少了從內核態到用戶態的數據拷貝

mmap適合于對同一塊區域頻繁讀寫的情況,比如一個64M的文件存儲了一些索引信息,我們需要頻繁修改并持久化到磁盤,這樣可以將文件通過mmap映射到用戶虛擬內存,然后通過指針的方式修改內存區域,由操作系統自動將修改的部分刷回磁盤,也可以自己調用msync手動刷磁盤。

責任編輯:趙寧寧 來源: 小白之家
相關推薦

2011-08-10 10:12:35

2015-09-18 10:40:04

OpenStackMetadata虛擬機配置

2009-12-18 09:27:23

Ruby讀寫excel

2011-05-23 18:12:09

SEO

2009-07-05 11:23:44

2023-11-15 18:46:49

HBase數據庫開源

2014-06-23 17:04:25

2009-08-03 11:38:57

linux at命令詳linux at命令

2017-08-01 17:34:47

Linux內核驅動文件讀寫

2024-07-08 12:51:05

2025-04-15 06:00:00

2010-04-27 09:16:49

2020-07-29 07:40:19

Linux系統Vim

2012-10-09 16:37:20

FastDFS

2021-02-26 20:55:56

JavaNIO隨機

2011-01-11 13:10:31

2024-07-26 21:29:37

2010-05-12 14:04:29

Oracle優化器

2021-08-05 10:00:02

Python編程語言

2010-01-15 16:21:45

VB.NET讀寫文本文
點贊
收藏

51CTO技術棧公眾號

操人视频在线观看欧美| 色婷婷av一区二区三区软件| 91在线看www| 天天干中文字幕| 精品国产18久久久久久洗澡| 欧美视频在线观看免费| 亚洲黄色一区二区三区| 国产99视频在线| 羞羞答答国产精品www一本| 中文字幕日韩在线观看| 深夜做爰性大片蜜桃| 啊啊啊久久久| 国产精品日产欧美久久久久| 147欧美人体大胆444| 日韩av一二三区| 日韩一区亚洲二区| 亚洲精品成a人在线观看| 黑人糟蹋人妻hd中文字幕| 在线观看黄色av| fc2成人免费人成在线观看播放| 国产精品无av码在线观看| 欧美人妻精品一区二区免费看| 国产精品美女久久久久久不卡| 欧美一级片在线看| 欧美xxxxx在线视频| 在线看女人毛片| 国产婷婷色一区二区三区在线| 国产精品播放| 国产日韩一级片| 日韩中文字幕1| 97在线视频免费播放| 亚洲综合久久av一区二区三区| 日韩成人av在线资源| 欧美一级一区二区| 成人亚洲免费视频| 亚洲第一影院| 疯狂蹂躏欧美一区二区精品| 男人添女人下部视频免费| 91青青在线视频| 久久久亚洲综合| 精品国产乱码久久久久久88av| 97人妻精品一区二区三区视频 | 中文天堂在线视频| 一区二区91| 久久免费国产视频| 精品国产乱码久久久久久鸭王1| 欧美久久综合网| 亚洲精品日韩久久久| 国产精品久久久久久亚洲色| 色悠久久久久综合先锋影音下载| 这里只有精品视频在线观看| 天堂网在线免费观看| 成人在线高清| 欧美日韩一区二区不卡| 亚洲高清在线免费观看| 韩国精品主播一区二区在线观看| 欧美日韩中文字幕综合视频 | 女人十八毛片嫩草av| 蜜桃tv一区二区三区| 精品一区二区电影| 公侵犯人妻一区二区三区| 免费看日本一区二区| 亚洲人免费视频| 第一次破处视频| 欧美亚洲高清| 日韩中文娱乐网| 91免费公开视频| 一区二区三区四区电影| 久久五月天色综合| 免费在线视频观看| 在线综合欧美| 国产精品成久久久久三级| 中文字幕在线日本| 久久99精品久久久久婷婷| 成人免费福利视频| 亚洲精品久久久久avwww潮水| 懂色av一区二区夜夜嗨| 国产视频一区二区不卡| 色播色播色播色播色播在线| 久久精品在这里| 一区二区三区四区不卡| 韩国av网站在线| 亚洲一线二线三线久久久| 阿v天堂2018| 国产免费不卡| 欧美理论片在线| 亚洲麻豆一区二区三区| 丝袜美腿一区二区三区动态图| 亚洲欧美另类中文字幕| 中国1级黄色片| 欧美久久综合| 国产成人精品在线视频| 国产精品呻吟久久| kk眼镜猥琐国模调教系列一区二区 | 大桥未久一区二区三区| caoporn-草棚在线视频最| 色综合久久久久综合体| 婷婷中文字幕在线观看| 久久影院资源站| 色悠悠国产精品| 久久午夜鲁丝片午夜精品| 羞羞答答国产精品www一本 | 欧美久久精品| 中文字幕在线观看日韩| 国产亚洲精品久久久久久打不开| 久久国产日韩| 91久久精品一区二区别| 你懂的在线免费观看| 亚洲美女区一区| 那种视频在线观看| 精品国产乱码一区二区三区 | 五月开心播播网| 日韩欧美午夜| 欧美亚洲日本黄色| 国产视频www| 中文字幕巨乱亚洲| av高清在线免费观看| 国产综合色激情| 亚洲免费人成在线视频观看| 激情视频在线播放| 麻豆91在线观看| 奇米视频888战线精品播放| 欧美videossex| 91麻豆精品国产自产在线| 玖玖爱在线观看| 亚洲精品少妇| 操人视频欧美| 免费黄色电影在线观看| 91久久一区二区| 亚洲成人av免费在线观看| 91精品高清| 国产精品三级网站| 精品视频二区| 欧美午夜激情小视频| 国产在线观看免费播放| 亚洲视频电影在线| 91精品久久久久久久久| 触手亚洲一区二区三区| 色综合色狠狠综合色| 大桥未久恸哭の女教师| 欧美福利电影在线观看| 95av在线视频| v片在线观看| 69堂国产成人免费视频| 2017亚洲天堂| 美女mm1313爽爽久久久蜜臀| 日本免费高清一区二区| 成人在线爆射| 亚洲视频在线免费观看| 久草视频在线观| 99久久亚洲一区二区三区青草| 欧美a级免费视频| 麻豆精品在线| 九九久久精品一区| 亚洲成人久久精品| 亚洲综合丁香婷婷六月香| 女人扒开双腿让男人捅| 欧美天天在线| 国产精品一区视频网站| 麻豆av在线免费观看| 精品免费日韩av| 日本三级片在线观看| av欧美精品.com| 九九九九免费视频| 网友自拍一区| 国产精品久久久久久久久久久久 | 91免费观看国产| 日本免费不卡一区二区| 亚州国产精品| 国产精品视频最多的网站| 男人天堂手机在线| 日韩欧美国产午夜精品| 中文在线观看免费网站| 26uuu精品一区二区三区四区在线| 久久久精品在线视频| 欧美色图在线播放| 91精品在线影院| 日本片在线观看| 日韩精品免费视频| 精品视频一二三区| 综合久久给合久久狠狠狠97色| 91精产国品一二三| 亚洲一区一卡| 亚洲一卡二卡| 国产精品调教视频| 国产精品极品美女在线观看免费| 美女羞羞视频在线观看| 欧美成人vps| 日韩免费av网站| 亚洲人亚洲人成电影网站色| 私密视频在线观看| 久久精品国产99国产精品| 亚洲国产一二三精品无码| 三级精品视频| 91精品视频大全| 牛牛精品一区二区| 久久久精品免费| 天堂av中文在线资源库| 欧美精品国产精品| 99久在线精品99re8热| 中文字幕制服丝袜一区二区三区| jjzz黄色片| 久久激五月天综合精品| 日韩五码在线观看| 亚洲女同另类| 色播五月综合| 国产香蕉精品| 91在线视频一区| 成人视屏在线观看| 国色天香2019中文字幕在线观看| 永久av在线| 亚洲裸体xxxx| 亚洲精品一区二区三区四区| 欧美午夜电影网| 天天综合网入口| 亚洲精品日韩综合观看成人91| 第一次破处视频| 97精品超碰一区二区三区| av噜噜在线观看| 日韩中文字幕一区二区三区| 六月婷婷在线视频| 黄色在线一区| 91精品一区二区三区四区| 大片网站久久| 欧美日韩在线精品一区二区三区| 91久久精品无嫩草影院| 成人疯狂猛交xxx| 成人亚洲网站| 国产精品第一页在线| 乡村艳史在线观看| 国内精品久久久久久影视8| 午夜精品一区| 中文字幕日韩av综合精品| 日本私人网站在线观看| 亚洲国产第一页| 欧美一级一区二区三区| 日韩欧美的一区二区| 国产毛片一区二区三区va在线| 欧美视频三区在线播放| 国产性生活视频| 色香蕉成人二区免费| 日本视频在线观看免费| 欧美日韩国产中文字幕| 香蕉免费毛片视频| 精品成人久久av| 久久久久久久黄色片| 污片在线观看一区二区| 日韩乱码人妻无码中文字幕| 无吗不卡中文字幕| 可以免费看的av毛片| 福利一区视频在线观看| 手机看片久久久| 91福利精品第一导航| 欧美brazzers| 欧美系列日韩一区| 亚洲自拍偷拍另类| 欧美一区二区在线看| 99热这里只有精| 欧美岛国在线观看| 人妻偷人精品一区二区三区| 亚洲成色777777在线观看影院| 亚欧洲精品视频| 亚洲欧洲第一视频| 91青青在线视频| 欧美成人网在线| 波多野结衣在线高清| 欧美一级电影在线| 成人免费av电影| 成人午夜黄色影院| 538任你躁精品视频网免费| 国产精品免费一区二区| 欧美日韩一本| 色综合电影网| 你懂的视频一区二区| 无码av天堂一区二区三区| 香蕉久久夜色精品| 一本色道久久亚洲综合精品蜜桃 | 成人中文字幕+乱码+中文字幕| 国产亚洲字幕| 好吊妞www.84com只有这里才有精品| 亚洲v天堂v手机在线| 深夜福利成人| 欧美日韩亚洲一区| 无码人妻丰满熟妇区五十路百度| 久久精品国产秦先生| 性生交大片免费看l| wwwwww.欧美系列| 国产又色又爽又高潮免费| 一区二区三区在线观看欧美| 国产精品100| 91.麻豆视频| 色播色播色播色播色播在线 | 国产精品69xx| 国产精品精品视频| heyzo欧美激情| 日韩欧美亚洲在线| 激情综合中文娱乐网| 成熟老妇女视频| 国产精品一区久久久久| 中国毛片在线观看| 亚洲综合精品久久| 中文字幕在线视频免费| 亚洲第一福利网站| 日韩av中文| 日本一本a高清免费不卡| 国产精品成人**免费视频| 欧美国产视频在线观看| 中出一区二区| 国产精品一区二区羞羞答答| eeuss鲁片一区二区三区在线观看| 欧美手机在线观看| 日本精品免费观看高清观看| 亚洲精品无遮挡| 日韩在线视频一区| 日本中文字幕一区二区| 国产一区二区三区四区hd| 香蕉精品视频在线观看| 日韩无套无码精品| 99久久国产免费看| 国产性xxxx| 欧美日韩国产一区二区三区地区| 午夜av免费在线观看| 欧美国产一区二区三区| 欧美日韩免费电影| 日韩精品无码一区二区三区| 一本久道久久综合婷婷鲸鱼| 久草福利在线观看| 中文字幕在线不卡| 中文字幕观看在线| 亚洲欧洲午夜一线一品| 激情国产在线| 精品高清视频| av不卡在线看| 人妖粗暴刺激videos呻吟| 亚洲精品va在线观看| 国产视频在线观看视频| 久久精品一偷一偷国产| 国产精品诱惑| 亚洲欧洲精品一区| 青青草国产精品97视觉盛宴| mm131丰满少妇人体欣赏图| 欧美日韩亚洲精品内裤| 四虎影视在线播放| 国产91成人video| 亚洲v天堂v手机在线| 欧美女人性生活视频| xnxx国产精品| 久久精品视频5| 亚洲午夜精品久久久久久性色| 欧美成人免费电影| 视频一区二区三区免费观看| 日精品一区二区三区| 微拍福利一区二区| 欧美日韩视频不卡| 色开心亚洲综合| 91在线视频九色| 亚洲香蕉网站| 国产精品无码专区| 色网站国产精品| 尤物网址在线观看| 成人a在线视频| 欧美日韩日本国产亚洲在线| 制服丝袜av在线| 狠狠色香婷婷久久亚洲精品| 麻豆影视在线| 国产情人节一区| 午夜精品亚洲| 国产黄色三级网站| 色视频欧美一区二区三区| 69av亚洲| 99精品在线直播| 亚洲综合三区| 国产又粗又长又硬| 欧美电影免费观看完整版| 欧美极品videos大乳护士| 日韩av电影免费播放| 韩国女主播成人在线| 久久精品视频9| 亚洲日本欧美中文幕| 欧美aaaaaaaa| 老太脱裤子让老头玩xxxxx| 久久人人爽爽爽人久久久| 一级黄色片网站| 国模精品视频一区二区| 国产一区二区电影在线观看| 亚洲图片 自拍偷拍| 精品久久久久久中文字幕一区奶水 | av在线免费播放网址| 555夜色666亚洲国产免| 成年女人在线看片| 亚洲不卡1区| 国产一区三区三区| 天天干天天干天天操| 按摩亚洲人久久| 爽爽窝窝午夜精品一区二区| av免费一区二区| 高跟丝袜欧美一区| 成人国产免费电影| 日本黑人久久| 成人黄色在线看|