GO語言自底向上優化

Go Ballast(通過嘗試降低 GC 頻率以提高整體性能,針對所有 Go應用都適用)

首先我們明白GO語言GC觸發條件是由比例來觸發的。例如,當前存活內存10GB,觸發比例是100%,因此下次觸發GC的時候是當內存達到20GB的時候觸發GC。這種機制在當前小內存的情況下會平凡觸發GC,例如當前只有1GC的話則內存達到2GB就要觸發GC。而單純提高比例到1000%,那么下次觸發GC的時候實際上內存已經有較大的壓力。所以,我們采用Ballast機制。

Ballast機制在小內存的時候會申請一些內存,已達到延緩下一次GC的時間。具體的,也就一行代碼:

// allocate 2GB ballast which resident in virtual memory only
ballastObject := make([]byte,1024*1024*1024*2)

首先,內存是在續存中分配,所以實際上我們是申請了這塊內存但沒映射到物理內存。

假設除 Ballast 以外的存活對象總大小為X字節(平均值),Ballast 對象大小為 B字節
1.Ballat 最多會帶來大約 B 字節的額外物理內存使用(值得注意的是,這部分多占用的物理內存依然是被除 Ballast 以外的對象所使用,不存在浪費問題,Ballast 本身僅僅存在于虛擬內存中,不會被實際地映射物理頁面)
2 Ballast能帶來性能優化的根本原因是降低了GC頻率

根據1得到:不管大內存還是小內存場景,Ballast 都會額外帶來最大為 B 字節的物理內存使用。
根據2得到:在大內存場景即X比較大時,一般來說此時 GC頻率會比較小,所以 Ballast帶來的優化效果不會像 X 為較小值時那么明顯。

那么這樣做在清理內存是否會占用更多時間?

答案:不會。GC主要是mark 和sweep。其中sweep速度很快,幾乎不暫用時間。在mark階段由于Ballast不是存活對像,所以不會被掃描到,因此幾乎也不占用時間。


CPUWorker(嘗試給 Go 帶來一個類似內核 CFS 調度器的 goroutime 調度器,以通過其提供的優先級機制保證關鍵goroutine 的延遲指標,目前還沒有在TiDB中嘗試
應用,Demo效果很好).

在linux中的調度算法采用CFS算法。CFS算法在休眠進程在喚醒時會獲得vruntime的補償(減少vruntime,提高這個進程優先級),它在醒來的時候有能力搶占CPU是大概率事件,這也是CFS調度算法的本意,即保證交互式進程的響應速度,因為交互式進程等待用戶輸入會頻繁休眠。

  • 計算密集型作業將運行很長時間,因此它將優先級放后;
  • I/O密集型作業會運行很短的時間,因此它只會稍微放后移動;

而goruntime調度器采用的是RR方式。這對IO密集型作業很不友好,交互式進程交互能力差。

解決方式:

1,使用CGO。但是CGO執行write的時候將會導致大內存復制。

2,再來一個并行的GOruntime實例進程。將go library編譯成CGO.so文件,然后通過我們GO的CGO來調用這個.so文件。所以這時候其實是有兩個隔開的進程也就是兩個GMP模型,所以原來的程序和這個IO密集型的.so文件的程序是不會互相影響的。

3,使用CPU worker。

https://docs.google.com/document/d/1g5SgpMg28XyMFdPTVMrZrZiLFBfAIgW8sMEXkKEQTzE/edit


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40044.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40044.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40044.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

碎片筆記|圖數據與圖神經網絡基礎介紹

前言:前段時間了解了一下圖神經網絡,本篇博客記錄一下相關知識,以備不時之需。 強烈推薦這篇博客(作者來自 Google Research),個人認為是圖神經網絡基礎入門的不二選擇! 目錄 一、圖數據1.1 定義…

Windows上使用FFmpeg實現本地視頻推送模擬海康協議rtsp視頻流

場景 Nginx搭建RTMP服務器FFmpeg實現海康威視攝像頭預覽: Nginx搭建RTMP服務器FFmpeg實現海康威視攝像頭預覽_nginx rtmp 海康攝像頭_霸道流氓氣質的博客-CSDN博客 上面記錄的是使用FFmpeg拉取海康協議攝像頭的rtsp流并推流到流媒體服務器。 如果在其它業務場景…

TCP/IP協議組

TCP/IP通信協議是目前最完整、使用最廣泛的通信協議。它的魅力在于可使不同硬件結構、不同操作系統的計算機相互通信。TCP/IP協議既可用于廣域網,也可用于局域網,它是Internet/Intranet的基石。TCP/IP通信協議事實上是一組協議。 TCP/IP協議可分為5層也可…

使用 Redis 實現共享 Session 的高效解決方案

系列文章目錄 文章目錄 系列文章目錄前言一、為什么需要共享 Session?二、使用 Redis 實現共享 Session1.安裝和配置 Redis2.實現 Session 存取操作3.使用 Session 數據三、測試共享 Session四、注意事項總結前言 在分布式系統中,實現共享 Session 是一個重要的問題。本文將…

GT Code - 圖譯算法編輯器(集成QT、C++、C、Linux、Git、java、web、go、高并發、服務器、分布式、網絡編程、云計算、大數據項目)

目錄 項目概述 發文意義 項目介紹 功能分析 設計概要 功能展示 項目文檔 項目概述 “GT Code 圖譯算法編輯器”是一款跨平臺、輕量級的代碼編輯器,主要面向軟件開發人員,它實現了編輯、編譯、繪制代碼流程圖、生成調試演示動畫等功能,以…

go版本glog/klog 參數使用方法心得

問題 glog很好用,但是官方文檔卻很爛,對于很多參數并沒有做詳細說明,于是通過看源碼測試,總結出以下使用方法 可選參數 flag.BoolVar(&logging.toStderr, "logtostderr", false, "log to standard error in…

空間分析專屬 Python 學習資料

空間數據分析能夠幫助我們更好地理解地理空間中的模式和關系,從而為決策提供支持。例如,城市規劃者可以使用空間數據分析來確定城市發展的最佳方向,環境科學家可以使用空間數據分析來評估污染的影響,而商業分析師可以使用空間數據…

react go實現用戶歷史登錄列表頁面

refer: http://ip-api.com/ 1.首先需要創建一個保存用戶歷史的登錄的表,然后連接go 2.在用戶登錄的時候,獲取用戶的IP IP位置,在后端直接處理數據即可(不需要在前端傳遞數據) (1)增加路由&am…

使用Java服務器實現UDP消息的發送和接收(多線程)

目錄 簡介:1. 導入必要的庫2. 創建服務器端代碼3. 創建客戶端代碼4. 實現多線程處理5. 測試運行示例代碼:函數說明服務器端代碼說明:客戶端代碼說明: 總結: 簡介: 在本篇博客中,我們將介紹如何…

genism word2vec方法

文章目錄 概述使用示例模型的保存與使用訓練參數詳解([原鏈接](https://blog.csdn.net/weixin_44852067/article/details/130221655))語料庫訓練 概述 word2vec是按句子來處理的Sentences(句子們) 使用示例 from gensim.models import Word2Vec #sent…

《起風了》C++源代碼

使用方法 Visual Studio、Dev-C、Visual Studio Code等C/C創建一個 .cpp 文件&#xff0c;直接粘貼賦值即可。 #include <iostream> #include <Windows.h> #pragma comment(lib,"winmm.lib") using namespace std; enum Scale {Rest 0, C8 108, B7 …

目錄——車載網絡安全

本文主要匯總車載網絡安全專欄文章,以方便各位讀者閱讀。 ISO21434 概述(一) ISO21434 組織網絡安全管理(二) ISO21434 項目網絡安全管理(三) ISO21434 分布式網絡安全(四) SO21434 持續進行的網絡安全(五) ISO21434 概念階段網絡安全(六)

線性代數(四) 特征值相似矩陣

前言 前面主要講述的是方程組和矩陣的關系&#xff0c;現在了解下矩陣和矩陣的關系 方陣的特征值與特征向量 假設A為n階方陣&#xff0c;對于一個數 λ \lambda λ 若存在&#xff1a;非零列向量 α \alpha α&#xff0c;使得&#xff1a; A α ? λ α ? A\vec{\alp…

2022年電賽C題——小車跟隨行駛系統——做題記錄以及經驗分享

前言 自己打算將做過的電賽真題&#xff0c;主要包含控制組的&#xff0c;近幾年出現的小車控制題目&#xff0c;自己做過的真題以及在準備電賽期間刷真題出現的問題以及經驗分享給大家 這次帶來的是22年電賽C題——小車跟隨行駛系統&#xff0c;這道題目指定使用的是TI的單片…

spring ico容器 spring注入方式 spring與tomcat整合

一、簡介 1、什么是spring&#xff1f; Spring是一個開源的輕量級Java應用開發框架&#xff0c;它提供了一種簡單、高效、靈活的方式來構建企業級應用程序。Spring框架的核心特點是依賴注入&#xff08;Dependency Injection&#xff09;和面向切面編程&#xff08;Aspect-Ori…

SpringBoot整合Redis完整篇

SpringBoot整合Redis完整篇 1、在springboot項目的pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schem…

分布式鎖有哪些應用場景和實現?

電商網站都會遇到秒殺、特價之類的活動&#xff0c;大促活動有一個共同特點就是訪問量激增&#xff0c;在高并發下會出現成千上萬人搶購一個商品的場景。雖然在系統設計時會通過限流、異步、排隊等方式優化&#xff0c;但整體的并發還是平時的數倍以上&#xff0c;參加活動的商…

WebRTC音視頻通話-實現GPUImage視頻美顏濾鏡效果iOS

WebRTC音視頻通話-實現GPUImage視頻美顏濾鏡效果 在WebRTC音視頻通話的GPUImage美顏效果圖如下 可以看下 之前搭建ossrs服務&#xff0c;可以查看&#xff1a;https://blog.csdn.net/gloryFlow/article/details/132257196 之前實現iOS端調用ossrs音視頻通話&#xff0c;可以查…

2023秋招筆試

檸檬微趣 將java的鏈表升序排序&#xff0c;鏈表用Class Node{int val,Node next}實現 import java.util.Comparator; import java.util.PriorityQueue; import java.util.Scanner;/*** 輸入一串數字&#xff0c;放入list中&#xff0c;實現sortList&#xff0c;返回升序的li…

將單個訓練數據集文件拆分為:image文件和label文件(pytorch學習+螞蟻蜜蜂數據集)

螞蟻蜜蜂分類數據集下載鏈接&#xff1a;https://download.pytorch.org/tutorial/hymenoptera_data.zip 要實現如圖操作&#xff1a; 將ants分為ants_image和ants_label 將bees分成bees_image和bees_label 創建ants_label和bees_label&#xff0c;并且以圖片名作為txt文件的…