1. 程式人生 > >低延遲系統的 11 個最佳實踐

低延遲系統的 11 個最佳實踐

八年前,谷歌發現每 500ms 的延遲會讓網路堵塞程度增加 20%,而亞馬遜也察覺 100ms 的延遲會使銷量降低 1%。從那以後,開發者就在減少延遲方面絞盡腦汁,以至於前端開發者試圖從他們用的 JS、CSS 甚至 HTML 中擠出每一毫秒。這篇文章接下來要介紹的就是在設計低延遲系統是要時刻注意的一些最佳實踐。大部分的建議看似荒謬卻被證實為是有用的,當然有時也需要一些權衡。(感謝在Quora 提出這個問題的匿名使用者,促使我將我的想法寫下來)。

選擇合適的語言

指令碼語言就不需要考慮這一點。雖然程式語言一直以來都在變得越來越快,只要你試圖將處理時間削減最後那麼幾毫秒,你就不能忽視解釋型語言。此外,你可能會需要一個強大的記憶體模式來進行無鎖程式設計,那麼你就要考慮使用 Java,、Scala、C++11或者Go。

儘量使用記憶體

I/O會增加延遲,所以要確保所有的資料都在記憶體中。這通常意味著要管理你的記憶體資料結構,維護持久日誌,這樣當機器或者程序重啟的時候能夠恢復之前的狀態。建立持久日誌的工具有Bitcask、 Krati、LevelDB 和 BDB-JE。除此之外,你可能可以投巧地執行一個本地的,持久的記憶體資料庫,比如說 Redis 或者MongoDB (當記憶體>>資料)。需要注意的是,當系統崩潰的時候你可能會丟失一些資料,因為它們的後臺和硬碟是同步的。

保持資料和處理在同一位置

網路躍遷(hop)比硬碟搜尋要快,但是它們仍然會間接增加延遲。理想說來,你的資料應該完全能夠放的進一臺主機裡的儲存器。AWS能夠提供將近 1/4TB 的雲記憶體,而物理伺服器通常有很多 TB 的空間。如果你需要使用多臺主機,那麼你要確保你正確地劃分好了資料和請求,這樣服務所需要的所有資料就都是本地可取的。

保持系統未充分利用

低延遲要求一直有資源來處理請求。不要試圖將你的硬體/軟體用到極限。要永遠給突發情況預留好空間。

最小化環境切換

環境轉換意味著你在處理多於現有資源可以處理的計算任務。你應該將執行緒數量減少到系統核心數量,然後各個執行緒運行於各自的核心中。

有序讀取

任何形式的儲存,無論是旋轉儲存、快閃記憶體,還是記憶體,當有序使用的時候都會大大提高效能。當你有序讀取記憶體時,你觸發了 RAM 和 CPU 快取級別的預取功能。如果處理正確,你需要的下一塊資料會在你需要它之前就到達L1快取。幫助這種處理的最簡單的方法就是儘量使用原始資料型別或者結構的陣列。按照這個原則,連結串列和物件陣列的使用是無論如何都要避免的。

批量處理寫任務

這聽上去違反直覺,但是批量寫可以大大提高效能。但是,這有一個誤區,就是這意味著系統必須在執行寫任務之前要等待一段時間。其實不然,一個執行緒應該是在一個緊湊的迴圈中不停地執行輸入輸出。每一個寫操作都會批量處理自從上一次執行寫任務之後接收到的所有資料。這樣一個既快速又有適應性的系統就生成了。

重視快取

經過所有這些優化處理後,快速訪問記憶體就變成了一個瓶頸。將執行緒固定於他們自己的核心中可以減少 CPU 快取汙染,序列化輸入輸出也可以預取快取。此外,使用原始資料型別可以減小記憶體大小,這樣快取就可以放下更多的資料。你也可以看看這個快取導向演算法:遞迴分解資料直到能夠放進快取中,然後再做其它必要的處理。

儘可能無鎖

和無鎖並無等待的資料結構和演算法交個朋友。每次你使用鎖,你都必須回溯到 OS 去幹涉鎖,這個鎖就是個很大的系統開銷。通常說來,如果你知道你在做什麼,你就可以通過了解JVM、C++ 或者 Go 的記憶體模式來避開鎖。

儘可能非同步

任何程式,尤其任何 I/O,只要不是建立響應所必須的,就應該在關鍵路徑之外進行。

儘可能並行化

任何程式,尤其任何I/O,只要能並行就應該並行處理。比如說如果你的高可用策略包括把交易日誌寫進硬碟併發送給第二個伺服器,那麼這些行為都是可以並行的。

相關推薦

延遲系統11 最佳實踐

八年前,谷歌發現每 500ms 的延遲會讓網路堵塞程度增加 20%,而亞馬遜也察覺 100ms 的延遲會使銷量降低 1%。從那以後,開發者就在減少延遲方面絞盡腦汁,以至於前端開發者試圖從他們用的 JS、CSS 甚至 HTML 中擠出每一毫秒。這篇文章接下來要介紹的就

延遲系統的Java實踐

在很久很久以前,如果有人讓我用Java語言開發一個低延遲系統,我肯定會用迷茫的眼神望著他,然後說“are you kidding me?”。然而隨著Java語言的日臻完善以及JVM效能的極速提升,使得用Java語言開發低延遲(不要和實時系統搞混)系統越來越成為可能,其中就包

MySQL性能優化的21最佳實踐 和 mysql使用索引

oct 靜態 state zid 希望 lte 適合 實踐 打開 今天,數據庫的操作越來越成為整個應用的性能瓶頸了,這點對於Web應用尤其明顯。關於數據庫的性能,這並不只是DBA才需要擔心的事,而這更是我 們程序員需要去關註的事情。當我們去設計數據庫表結構,對操作數據庫時(

MySQL性能優化的21最佳實踐

明顯 架構 crash 其它 string 簡單的 nts arch 網絡 當我們去設計數據庫表結構,對操作數據庫時(尤其是查表時的SQL語句),我們都需要註意數據操作的性能。這裏,我們不會講過多的SQL語句的優化,而只是針對MySQL這一Web應用最多的數據庫。 1. 為

完美CSS文檔的8最佳實踐

風格 產品經理 sta war support display 主題 ucd 發生 在css的世界,文檔沒有被得到充分的利用。由於文檔對終端用戶不可見,因此它的價值常常被忽視。另外,如果你第一次為css編寫文檔,可能很難確定哪些內容值得記錄,以及如何能夠高效完

數據湖是一種方法 數據湖的四最佳實踐

發出 就是 arc 而不是 程序集 image new 裏的 子郵件 轉載自:http://bigdata.chinabyte.com/311/13871811.shtml數據湖聽起來很簡單:把數據或信息匯集到一個結合處理速度和存儲空間的大數據系統――Hadoop集群或內存

Java 中處理異常的 9 最佳實踐

lan method 永遠 是否 res ati 是你 dex mes 在本文中,作者介紹了9個處理異常的最佳方法與實踐,以舉例與代碼展示結合的方式,讓開發者更好的理解這9種方式,並指導讀者在不同情況下選擇不同的異常處理方式。 以下為譯文: Java中的異常處理不是一個簡單

編寫 Node.js Rest API 的 10 最佳實踐

Node.js 除了用來編寫 WEB 應用之外,還可以用來編寫 API 服務,我們在本文中會介紹編寫 Node.js Rest API 的最佳實踐,包括如何命名路由、進行認證和測試等話題,內容摘要如下: 正確使用 HTTP Method 和路由 正確的使用 HTTP 狀態碼 使用 HTTP H

Java 程式設計中關於異常處理的10最佳實踐

        異常處理是Java 開發中的一個重要部分。它是關乎每個應用的一個非功能性需求,是為了處理任何錯誤狀況,比如資源不可訪問,非法輸入,空輸入等等。Java提供了幾個異常處理特性,以try,catch 和 finally 關鍵字的形式內建於語言自

有效資料湖攝取的5最佳實踐

在不斷波動的技術環境和客戶市場政策的世界中,資料已成為最大的商業資產之一。它加強並提高了組織在競爭中取得領先地位的能力。因此,它是一個關鍵的價值創造者,其管理,定期維護和儲存對於規劃未來持續成功的企業來說非常重要。多年來技術的進步在資料建立和儲存方面都是有利的,但它們永遠不足以進行有效的資料管理。有時,企

Java異常處理的9最佳實踐

無論你是新手還是資深程式設計師,複習下異常處理的實踐總是一件好事,因為這能確保你與你的團隊在遇到問題時能夠處理得了它。 在 Java 中處理異常並不是一件易事。新手覺得處理異常難以理解,甚至是資深開發者也會花上好幾個小時來討論是應該丟擲拋異常還是處理異常。 這就是為何大多

規模化敏捷開發的10最佳實踐(上)

【編者按】軟體開發和採購人員經常會對現有軟體開發方法、技巧和工具產生一些疑問。針對這些疑問,Kevin Fall 整理了五個軟體方面的話題:Agile at Scale,Safety-Critical Systems,Monitoring Software-In

編寫 Dockerfile 的五最佳實踐

此文適合Docker初學入門讀者,大師請繞行!,遵守最佳實踐可少踩坑、提升效能體驗及可移植性,期望對讀者有所幫助! 什麼是Dockerfile Dockerfile 是一個文字檔案,裡面包含了打包Docker映象所需要用到的命令。Docker 可以通

Java中處理異常的9最佳實踐

【譯者注】在本文中,作者介紹了9個處理異常的最佳方法與實踐,以舉例與程式碼展示結合的方式,讓開發者更好的理解這9種方式,並指導讀者在不同情況下選擇不同的異常處理方式。 以下為譯文:Java中的異常處理不是一個簡單的話題。初學者很難理解,甚至有經驗的開發人員也會

極限程式設計(XP)12最佳實踐

現場客戶 ( On-site Customer ) 程式碼規範 ( Code Standards ) 每週40小時工作制 ( 40-hour Week ) 計劃博弈 ( Planning Game ): 要求結合專案進展和技術情況,確定下一階段要開發與釋出的系統範圍。 系統隱喻 ( System Meta

針對雲遷移的 21 最佳實踐

熟能生巧。-Bobby Robson 在過去幾個月裡,我花了很多時間與各種 AWS 客戶和團隊合作來打造幫助企業加快雲遷移工作的全面計劃。此計劃包含許多方面,包括 (但不限於) AWS 服務 (例如,AWS Database Migration Service、AWS Sno

軟體開發和測試的 30 最佳實踐

這些軟體開發和測試的最佳實踐,可以幫你節省時間和避免問題。 加入一個企業文化和程式設計實踐已經定型的新公司,可能會是一種令人沮喪的經歷。當我加入 Ansible 團隊後,我決定整理我多年以來所學併為之奮鬥的軟體工程實踐和準則。這是一個不明確的也不夠詳盡的準則列表

編寫超級可讀程式碼的15最佳實踐

譯者:蔣宇捷(轉載請標明出處-http://blog.csdn.net/hfahe) 一月兩次,我們重溫Nettuts歷史上讀者最喜歡的文章。        程式碼可讀性是一個計算機程式設計世界的普遍主題。它是我們作為開發者第一件學習的事情。這篇文章將闡述編寫可讀性程

Hadoop管理員的十最佳實踐

宣告 以下內容轉自 http://www.infoq.com/cn/articles/hadoop-ten-best-practice 前言 接觸Hadoop有兩年的時間了,期間遇到很多的問題,既有經典的NameNode和JobTracker記憶體溢位故障,也有HDFS儲存

關於JAVA異常處理的20最佳實踐

部分 http 行數據 似的 輸入 如果 並不會 中產 建議 在我們深入了解異常處理最佳實踐的深層概念之前,讓我們從一個最重要的概念開始,那就是理解在JAVA中有三種一般類型的可拋類: 檢查性異常(checked exceptions)、非檢查性異常(unchecked E