在研究mysql配置檔案中sync_binlog=n引數之中,發現該引數的含義是在n個sql之後,呼叫了fdatasync()函式重新整理binlog到磁碟,所以就好好研究了下sync、fsync和fdatasync這三個函式,也記錄下來分享一波。
名詞解釋:
髒頁:當程序修改了快取中的資料時,該頁就被標記為臟頁
記憶體對映:乙個檔案到一塊記憶體的對映
延遲寫(delayed write): 傳統的unix實現在核心中設有緩衝區快取記憶體或頁面快取記憶體,大多數磁碟i/o都通過緩衝進行。 當將資料寫入檔案時,核心通常先將該資料複製到其中乙個緩衝區中,如果該緩衝區尚未寫滿,則 並不將其排入輸出佇列,而是等待其寫滿或者當核心需要重用該緩衝區以便存放其他磁碟塊資料時, 再將該緩衝排入到輸出佇列,然後待其到達隊首時,才進行實際的i/o操作。
延遲寫減少了磁碟讀寫的次數,但是降低了檔案內容的更新速度,所以就會在一段時間內檔案資料沒有寫到磁碟上,
為了保證磁碟上實際檔案系統與緩衝區中內容保持一致,unix提供了sync、fsync、fdatasync三個函式。
sync函式:
只是將所有修改過的塊緩衝區排入寫佇列,然後就返回,並不等待實際寫磁碟操作結束
如:update的系統守護程序會週期性的呼叫sync函式(一般每30s),保證定期沖洗核心的塊緩衝區
sync函式原型:
fsync函式:
只對由檔案描述符filedes(與開啟檔案相對應)
指定的單一檔案起作用,且等待寫磁碟操作結束,然後返回。該呼叫會阻塞等待直到裝置報告io完成。
可用於資料庫(因為資料庫需要確保修改過的塊立即寫到磁碟上)
fdatasync函式:
類似於fsync,只影響檔案的資料部分,而除資料外,
fsync還同步更新檔案的屬性。
如:對於提供事務支援的資料庫,在事務提交時,要確保事務日誌(該事務所有的修改操作和乙個提交記錄)完全寫到硬碟上,才認定事務提交成功並返回給應用層
fsync和fdatasync函式原型:
說明:fd:要操作的檔案描述符
fsync與fdatasync區別:
除了同步檔案的修改內容(髒頁),fsync還會同步檔案的描述資訊(metadata,包括size、訪問時間等等),因為檔案的資料和metadata通常存在硬碟的不同地方,因此fsync至少需要兩次io寫操作 總結
1、如果是對所有的緩衝區發出寫硬碟的命令,應該使用sync函式,但應該注意該函式僅僅只是把該命令放入佇列就返回了。
2、如果是要把乙個已經開啟的檔案所做的修改提交到硬碟,應呼叫fsync函式,該函式會在資料實際寫入硬碟後才返回,因此是最安全最可靠的方式。
3、如果是針對乙個已經開啟的檔案流操作,則應該首先呼叫fsync函式把修改同步到核心緩衝區,然後再呼叫fsync把修改真正的同步到硬碟。
SQL與NoSQL MySQL與NoSQL的融合
寫這一篇內容的原因是mysql5.6.2突然推出了memcached的功能。nosql to innodb with memcached的出現,可以看出nosql對關聯式資料庫的確產生了巨大的影響,個人覺得這是乙個非常大的進步,可以讓開發人員更加方便的使用nosql和關聯式資料庫。nosql一般被認...
指標與陣列 a與 a區別
假設宣告了乙個陣列a,則 a表示陣列a的首位址,a與 a 0 表示陣列a首元素的首位址,那麼 a 1與a 1有哪些區別呢?通過下面的實驗來說明。int i 0 int a 5 int p int a 1 for i 0 i 5 i printf a 0x p,a 0x p,a 1 0x p n a,...
apache與tomcat與weblogic對比
apache,tomcat,weblogic都是常用的中介軟體,發布 等應用都離不開這些好東東。強大程度對比apache 新手容易將apache與tomcat混亂。apache與tomcat都是同乙個公司生產的,apache是輕量級的,tomcat是企業級的。apache一般與php mysql等整...