總結補充:關於零拷貝記憶體中有幾分buffer
kafka作為訊息中介軟體,雖然是基於磁碟做資料儲存。但是有高效能、高吞吐、低延遲等特點。
磁碟順序讀寫效能高於記憶體的隨機讀寫
kafka將訊息記錄持久化到磁碟,有新訊息時,通過不斷追加的方式將message追加到檔案磁碟末尾
kafka利用了作業系統本身的 page cache,即利用的是作業系統自身的記憶體而不是jvm空間記憶體,這樣做主要有以下兩點好處
零拷貝只減少不必要的拷貝次數。通常是減少io讀寫過程中的拷貝次數。
零拷貝主要減少兩部分的開銷:
比如:讀取檔案,再用socket傳送出去實際上並不需要傳統io方式的第二個和第三個資料副本。應用程式除了快取資料並將其傳輸回套接字緩衝區之外什麼都不做。相反,資料可以直接從讀緩衝區傳輸到套接字緩衝區。傳統方式實現:
先讀取、再傳送,實際經過1~4四次copy。
buffer = file.read
socket.send(buffer)
顯然,第二次和第三次資料copy 其實在這種場景下沒有什麼幫助反而帶來開銷,這也正是零拷貝出現的意義。
這種場景:是指讀取磁碟檔案後,不需要做其他處理,直接用網路傳送出去。試想,如果讀取磁碟的資料需要用程式進一步處理的話,必須要經過第二次和第三次資料copy,讓應用程式在記憶體緩衝區處理。
此時我們會發現使用者態「空空如也」。資料沒有來到使用者態,而是直接在核心態就進行了傳輸,但這樣依然還是有多次複製。首先資料被讀取到read buffer中,然後發到socket buffer,最後才發到網絡卡。雖然減少了使用者態和核心態的切換,但依然存在多次資料複製。
如果可以進一步減少資料複製的次數,甚至沒有資料複製是不是就會做到最快呢?dmadma,全稱叫direct memory access,一種可讓某些硬體子系統去直接訪問系統主記憶體,而不用依賴cpu的計算機系統的功能。聽著是不是很厲害,跳過cpu,直接訪問主記憶體。傳統的記憶體訪問都需要通過cpu的排程來完成。如下圖:
dma,則可以繞過cpu,硬體自己去直接訪問系統主記憶體。如下圖
kafka採用
分割槽分段設計
索引方面的優化
批量讀寫資料
從而使kafka有了高效能、高吞吐、低延時的特點
快速讀取SharedPreferences資料
在開發時時常要用到sharedpreferences存入和讀取一些資料,如果activity很多的話,每次都定義一次sharedpreferences非常麻煩。其實可以很簡單地將sharedpreferences的讀寫抽出來形成乙個工具類,方便呼叫 public class sharedprefer...
kafka搭建 快速搭建Kafka服務
搞流處理的話,無論如何是繞不過kafka的了,還好kafka是乙個概念比較好理解的架構模型。我覺得官方的這三張圖已經很好地把模型結構給闡述清楚了。發布 訂閱模型 實現訊息寫入與訊息讀取解耦。kafka相當於是乙個訊息緩衝池 2.日誌檔案順序結構 kafka的高吞吐量就是依賴順序寫入 當然還包括了一些...
python快速讀取excel
python處理excel資料也是經常需要用到的。本文介紹2種python讀取excel的方法 openpyxl和pandas。事實上,pandas讀取excel比openpyxl更方便,有需要的直接往後拉,看第二種。import openpyxl excel name t1.xlsx wb ope...