Nginx openresty web服務 與 Go 原生web服務性能對比

1 概述

Nginx采用的是IO復用模型,能處理超高并發。
Go語言采用協程,能輕量級的處理超高并發。
那么在不考慮業務邏輯復雜的前提下,即假如將Nginx和Go都提供一個/test接口,并在接口邏輯中都只是讓其做20毫秒的耗時操作,那么這兩者的性能差異大概是多少呢?嘗試一下

2 環境說明

Centos 服務器環境說明:在這里插入圖片描述

3 源代碼

3.1 go

package mainimport ("net/http""time""log"
)func handler(w http.ResponseWriter, r *http.Request) {// 模擬 20ms 業務處理time.Sleep(20 * time.Millisecond)w.Write([]byte("OK"))
}func main() {http.HandleFunc("/test", handler)log.Println("Go server listening on :8080")if err := http.ListenAndServe(":8080", nil); err != nil {log.Fatal(err)}
}

3.2 nginx openresty

worker_processes  auto;
events {worker_connections 10240;
}http {# 如果你原來有其它配置項(如 log_format、lua_shared_dict 等),保留它們server {listen 8081;location = /test {content_by_lua_block {-- 模擬 20 ms 業務處理ngx.sleep(0.02)ngx.say("OK")}}}
}

4 啟動服務

go服務啟動端口為8080
在這里插入圖片描述
nginx openresty 服務啟動端口為8081
在這里插入圖片描述

5 ab工具壓測

5.1 第一輪:100并發共請求1萬次

go:
ab -n 10000 -c 100 http://127.0.0.1:8080/

Concurrency Level:      100
Time taken for tests:   2.134 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Non-2xx responses:      10000
Total transferred:      1760000 bytes
HTML transferred:       190000 bytes
Requests per second:    4685.38 [#/sec] (mean)
Time per request:       21.343 [ms] (mean)
Time per request:       0.213 [ms] (mean, across all concurrent requests)
Transfer rate:          805.30 [Kbytes/sec] received

nginx:

Concurrency Level:      100
Time taken for tests:   3.322 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      1288900000 bytes
HTML transferred:       1286460000 bytes
Requests per second:    3010.62 [#/sec] (mean)
Time per request:       33.216 [ms] (mean)
Time per request:       0.332 [ms] (mean, across all concurrent requests)
Transfer rate:          378944.26 [Kbytes/sec] received

小結:100并發情況下,go的QPS為4685,nginx的qps為3010

5.2 第二輪:500并發共請求5萬次

ab -n 50000 -c 500 http://127.0.0.1:8080/

go:

Concurrency Level:      500
Time taken for tests:   8.483 seconds
Complete requests:      50000
Failed requests:        0
Write errors:           0
Non-2xx responses:      50000
Total transferred:      8800000 bytes
HTML transferred:       950000 bytes
Requests per second:    5893.87 [#/sec] (mean)
Time per request:       84.834 [ms] (mean)
Time per request:       0.170 [ms] (mean, across all concurrent requests)
Transfer rate:          1013.01 [Kbytes/sec] received

nginx:

Concurrency Level:      500
Time taken for tests:   18.526 seconds
Complete requests:      50000
Failed requests:        0
Write errors:           0
Total transferred:      6444500000 bytes
HTML transferred:       6432300000 bytes
Requests per second:    2698.86 [#/sec] (mean)
Time per request:       185.264 [ms] (mean)
Time per request:       0.371 [ms] (mean, across all concurrent requests)
Transfer rate:          339702.78 [Kbytes/sec] received

奇怪,為什么500并發情況下,go的QPS有5893,而Nginx只有2698

5.3 第三輪:1000并發共請求10萬次

go:
在這里插入圖片描述

Concurrency Level:      1000
Time taken for tests:   21.770 seconds
Complete requests:      100000
Failed requests:        0
Write errors:           0
Non-2xx responses:      100000
Total transferred:      17600000 bytes
HTML transferred:       1900000 bytes
Requests per second:    4593.43 [#/sec] (mean)
Time per request:       217.702 [ms] (mean)
Time per request:       0.218 [ms] (mean, across all concurrent requests)
Transfer rate:          789.50 [Kbytes/sec] received

nginx:
在這里插入圖片描述

Concurrency Level:      1000
Time taken for tests:   39.272 seconds
Complete requests:      100000
Failed requests:        0
Write errors:           0
Total transferred:      12889000000 bytes
HTML transferred:       12864600000 bytes
Requests per second:    2546.37 [#/sec] (mean)
Time per request:       392.715 [ms] (mean)
Time per request:       0.393 [ms] (mean, across all concurrent requests)
Transfer rate:          320509.78 [Kbytes/sec] received

1000并發下,go的QPS有4593,nginx的QPS只有2546

6 小結

1.在如上配置的服務器環境+配置(注意:Nginx的配置應該可以一定程度上進行調優,這里暫時先不測試了)的情況下
2.go和nginx都提供一個/test的接口,且耗時都是在固定20秒的情況下
3.1000并發請求是,go的QPS為4.5k左右,nginx的QPS大概為2.5k左右。

7 臨時想到的Python和Java

7.1 Python3.6

既然看到了go語言的情況,自然又要拿出我們的老朋友python來測試一下了:

import asyncio
from aiohttp import webasync def handler(request):# 模擬 20 毫秒的耗時操作await asyncio.sleep(0.02)return web.Response(text="OK")app = web.Application()
app.router.add_get('/test', handler)if __name__ == '__main__':web.run_app(app, host='0.0.0.0', port=8080)

在這里插入圖片描述
在經過了漫長的等待:故障了!
在這里插入圖片描述
所以決定將并發控制在200,總請求數控制在20000

Concurrency Level:      200
Time taken for tests:   52.494 seconds
Complete requests:      20000
Failed requests:        0
Write errors:           0
Non-2xx responses:      20000
Total transferred:      3440000 bytes
HTML transferred:       280000 bytes
Requests per second:    381.00 [#/sec] (mean)
Time per request:       524.941 [ms] (mean)
Time per request:       2.625 [ms] (mean, across all concurrent requests)
Transfer rate:          64.00 [Kbytes/sec] received

從這里來看python3.6的QPS大概是381(注意!應該是有調優空間的,且每個接口中耗時20毫秒)

7.2 java1.8

import com.sun.net.httpserver.HttpServer;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpExchange;import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;public class SimpleHttpServer {public static void main(String[] args) throws IOException {// 創建 HTTP 服務器,監聽端口 8080HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);// 創建上下文,處理 /test 路徑的請求server.createContext("/test", new MyHandler());// 設置默認的執行器server.setExecutor(null);// 啟動服務器server.start();System.out.println("Java HTTP server started on port 8080");}static class MyHandler implements HttpHandler {@Overridepublic void handle(HttpExchange exchange) throws IOException {try {// 模擬 20 毫秒的耗時操作Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}String response = "OK";exchange.sendResponseHeaders(200, response.length());OutputStream os = exchange.getResponseBody();os.write(response.getBytes());os.close();}}
}

200并發2萬請求試試:3171

Concurrency Level:      200
Time taken for tests:   6.306 seconds
Complete requests:      20000
Failed requests:        0
Write errors:           0
Non-2xx responses:      20000
Total transferred:      2420000 bytes
HTML transferred:       1000000 bytes
Requests per second:    3171.68 [#/sec] (mean)
Time per request:       63.058 [ms] (mean)
Time per request:       0.315 [ms] (mean, across all concurrent requests)
Transfer rate:          374.78 [Kbytes/sec] received

1000并發10萬請求試試:5271

Concurrency Level:      1000
Time taken for tests:   18.969 seconds
Complete requests:      100000
Failed requests:        0
Write errors:           0
Non-2xx responses:      100000
Total transferred:      12100000 bytes
HTML transferred:       5000000 bytes
Requests per second:    5271.80 [#/sec] (mean)
Time per request:       189.688 [ms] (mean)
Time per request:       0.190 [ms] (mean, across all concurrent requests)
Transfer rate:          622.94 [Kbytes/sec] received

8 總結

1.go1.20 QPS 4.5k左右
2.nginx QPS 2.5k左右
3.python3.6 QPS 381左右
4.java1.8 QPS 5.2k左右

難不成是我測試的有問題?怎么java比go的QPS居然還要高?(有可能是調優問題+環境問題,go語言的性能可能在更高配置的環境下可能性能更高)該數據僅供參考

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

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

相關文章

[創業之路-377]:企業法務 - 有限責任公司與股份有限公司的優缺點對比

有限責任公司(簡稱“有限公司”)與股份有限公司(簡稱“股份公司”)是我國《公司法》規定的兩種主要公司形式,二者在設立條件、治理結構、股東權利義務等方面存在顯著差異。以下從核心特征、設立條件、治理結構、股東權…

QEMU源碼全解析 —— 塊設備虛擬化(21)

接前一篇文章:QEMU源碼全解析 —— 塊設備虛擬化(20) 本文內容參考: 《趣談Linux操作系統》 —— 劉超,極客時間 《QEMU/KVM源碼解析與應用》 —— 李強,機械工業出版社 特此致謝! 上一回開始解析blockdev_init函數,講到了其中調用的blk_new_open函數,該函數的作用…

藍橋杯中的知識點

總結: 這次考的并不理想 比賽前好多知識點遺漏 但到此為止已經結束了 mod 是 模運算(Modulo Operation)的縮寫,表示求兩個數相除后的 余數 10mod31 (a % b) (7%21) 1e9代表1乘以10的9次方&#xff0c…

批量替換多個 Word 文檔中的指定圖片

在 Word 文檔中,我們可以插入各種各樣的圖片,比如插入 logo、插入設計圖、施工圖等等。在某些情況下,我們也會碰到需要將 Word 文檔中某張圖片替換成其它圖片的場景,比如將舊的 Logo 替換成新的 Logo。當我們有大量的 Word 文檔需…

基于微信小程序的中醫小妙招系統的設計與實現

hello hello~ ,這里是 code袁~💖💖 ,歡迎大家點贊🥳🥳關注💥💥收藏🌹🌹🌹 🦁作者簡介:一名喜歡分享和記錄學習的在校大學生…

Java 8 新特性深度解析:現代編程的轉折點

精心整理了最新的面試資料和簡歷模板,有需要的可以自行獲取 點擊前往百度網盤獲取 點擊前往夸克網盤獲取 Java 8 是 Java 發展史上的重要里程碑,它引入了函數式編程范式、增強了集合處理能力,并徹底革新了日期時間處理方式。本文將通過代碼示…

鷓鴣云平臺實時追蹤任務進度的核心機制

一、?三維可視化監控? BIMGIS融合建模?:通過無人機測繪與三維建模技術生成施工場地數字孿生模型,支持實時查看各標段三維模型與施工進度的匹配度,偏差超過5%自動觸發預警。 進度匹配度分析?:中央數據中臺整合施工規劃、資源…

【Spring Boot】MyBatis多表查詢的操作:注解和XML實現SQL語句

1.準備工作 1.1創建數據庫 (1)創建數據庫: CREATE DATABASE mybatis_test DEFAULT CHARACTER SET utf8mb4;(2)使用數據庫 -- 使?數據數據 USE mybatis_test;1.2 創建用戶表和實體類 創建用戶表 -- 創建表[??表…

ISO15189認證有什么要求?ISO15189認證流程

ISO 15189 認證要求及流程詳解 ISO 15189 是國際標準化組織(ISO)針對 醫學實驗室質量和能力 的認證標準,適用于醫院檢驗科、第三方醫學實驗室、血站等機構。該認證確保實驗室的技術能力和管理體系符合國際標準,提高檢測結果的準確…

【Linux】調試工具gdb的認識和使用指令介紹(圖文詳解)

目錄 1、debug和release的知識 2、gdb的使用和常用指令介紹: (1)、windows下調試的功能: (2)、進入和退出: (3)、調試過程中的相關指令: 3、調試究竟是在…

【Pytorch 中的擴散模型】去噪擴散概率模型(DDPM)的實現

介紹 廣義上講,擴散模型是一種生成式深度學習模型,它通過學習到的去噪過程來創建數據。擴散模型有很多變體,其中最流行的通常是文本條件模型,它可以根據提示生成特定的圖像。一些擴散模型(例如 Control-Net&#xff0…

Milvus(3):數據庫、Collections說明

1 數據庫 Milvus 在集合之上引入了數據庫層,為管理和組織數據提供了更有效的方式,同時支持多租戶。 1.1 什么是數據庫 在 Milvus 中,數據庫是組織和管理數據的邏輯單元。為了提高數據安全性并實現多租戶,你可以創建多個數據庫&am…

【質量管理】“武藏曲線”和“微笑曲線”的差異

什么是“微笑曲線” 在電子制造領域,“微笑曲線”(Smiling Curve)是由宏碁集團創始人施振榮于1992年提出的一個理論模型,用于描述產業鏈中不同環節的附加價值分布。該曲線因形狀類似“微笑”而得名,核心觀點是&#xf…

【html】a標簽target屬性以及擴展應用

進行頁面新窗口打開跳轉&#xff0c;我們使用 <a> 標簽即可實現。 <a>標簽可以通過設置target的值來控制此鏈接的打開方式&#xff0c;一般可取以下值&#xff1a; _self&#xff1a;默認值&#xff0c;鏈接在當前窗口打開 _blank&#xff1a;鏈接在新窗口打開 …

一文讀懂什么是 MCP、A2A、ANP

在人工智能快速發展的今天&#xff0c;智能體&#xff08;Agent&#xff09;正逐步成為互聯網交互的新主體。它們不僅能替代人類完成復雜任務&#xff0c;還能通過協作形成更高效的網絡生態。然而&#xff0c;這一切的實現離不開通信協議的支持。本文將解析智能體領域的三大核心…

Python3網絡爬蟲開發--爬蟲基礎

網絡爬蟲基礎 1.1 HTTP基本原理 1.1.1 URI和URL URI即統一資源標志符,URL即統一資源定位符。 有這樣一個鏈接,http://test.com/test.txt,在這個鏈接中,包含了訪問協議https,訪問目錄(即根目錄),資源名稱(test.txt)。通過這樣的鏈接,可以在互聯網上找到這個資源,這…

OpenCV顏色變換cvtColor

OpenCV計算機視覺開發實踐&#xff1a;基于Qt C - 商品搜索 - 京東 顏色變換是imgproc模塊中一個常用的功能。我們生活中看到的大多數彩色圖片都是RGB類型的&#xff0c;但是在進行圖像處理時需要用到灰度圖、二值圖、HSV&#xff08;六角錐體模型&#xff0c;這個模型中顏色的…

Hadoop----高可用搭建

目錄標題 **什么是高可用&#xff1f;****?搭建的步驟**一.jdk**安裝配置**- **要點**: 二.zookeeper**集群配置**- **要點** 三.Hadoop高可用的搭建- **要點**①環境變量的配置②配置文件的修改 ③內容分發④集群任務的初次啟動 什么是高可用&#xff1f; 通過冗余設計 自動…

【Rust 精進之路之第15篇-枚舉 Enum】定義、變體與數據關聯:表達多種可能性

系列: Rust 精進之路:構建可靠、高效軟件的底層邏輯 作者: 碼覺客 發布日期: 2025年4月20日 引言:當值擁有“選項”——超越結構體的表達力 在上一篇【結構體 Struct】中,我們學習了如何使用結構體將多個相關的數據字段組合成一個有意義的整體。結構體非常適合表示那些…

模擬實現strncat、qsort、atoi

目錄 前言 一、模擬實現strncat 參數 代碼演示&#xff1a; 二、模擬實現qsort 參數 代碼演示&#xff1a; 前言 本文主要是對strncat&#xff0c;qsort&#xff0c;atoi的模擬實現 一、模擬實現strncat C 庫函數 char *strncat(char *dest, const char *src, size_t n…