色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

單機如何優化高性能秒殺系統

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 作者:馬哥Linux運維 ? 2022-08-26 10:43 ? 次閱讀

每到節假日期間,一二線城市返鄉、外出游玩的人們幾乎都面臨著一個問題:搶火車票!雖然現在大多數情況下都能訂到票,但是放票瞬間即無票的場景,相信大家都深有體會。

尤其是春節期間,大家不僅使用12306,還會考慮“智行”和其他的搶票軟件,全國上下幾億人在這段時間都在搶票。

“12306服務”承受著這個世界上任何秒殺系統都無法超越的QPS,上百萬的并發再正常不過了!筆者專門研究了一下“12306”的服務端架構,學習到了其系統設計上很多亮點,在這里和大家分享一下并模擬一個例子:如何在100萬人同時搶1萬張火車票時,系統提供正常、穩定的服務。

1. 大型高并發系統架構

高并發的系統架構都會采用分布式集群部署,服務上層有著層層負載均衡,并提供各種容災手段(雙火機房、節點容錯、服務器災備等)保證系統的高可用,流量也會根據不同的負載能力和配置策略均衡到不同的服務器上。下邊是一個簡單的示意圖:

49a8f91c-247b-11ed-ba43-dac502259ad0.jpg

1.1 負載均衡簡介

上圖中描述了用戶請求到服務器經歷了三層的負載均衡,下邊分別簡單介紹一下這三種負載均衡:

OSPF(開放式最短鏈路優先)是一個內部網關協議(Interior Gateway Protocol,簡稱IGP)。OSPF通過路由器之間通告網絡接口的狀態來建立鏈路狀態數據庫,生成最短路徑樹,OSPF會自動計算路由接口上的Cost值,但也可以通過手工指定該接口的Cost值,手工指定的優先于自動計算的值。OSPF計算的Cost,同樣是和接口帶寬成反比,帶寬越高,Cost值越小。到達目標相同Cost值的路徑,可以執行負載均衡,最多6條鏈路同時執行負載均衡。

LVS (Linux VirtualServer),它是一種集群(Cluster)技術,采用IP負載均衡技術和基于內容請求分發技術。調度器具有很好的吞吐率,將請求均衡地轉移到不同的服務器上執行,且調度器自動屏蔽掉服務器的故障,從而將一組服務器構成一個高性能的、高可用的虛擬服務器。

Nginx想必大家都很熟悉了,是一款非常高性能的http代理/反向代理服務器,服務開發中也經常使用它來做負載均衡。Nginx實現負載均衡的方式主要有三種:輪詢、加權輪詢、ip hash輪詢,下面我們就針對Nginx的加權輪詢做專門的配置和測試

1.2 Nginx加權輪詢的演示

Nginx實現負載均衡通過upstream模塊實現,其中加權輪詢的配置是可以給相關的服務加上一個權重值,配置的時候可能根據服務器的性能、負載能力設置相應的負載。

下面是一個加權輪詢負載的配置,我將在本地的監聽3001-3004端口,分別配置1,2,3,4的權重:


#配置負載均衡    upstream load_rule {       server 127.0.0.1:3001 weight=1;       server 127.0.0.1:3002 weight=2;       server 127.0.0.1:3003 weight=3;       server 127.0.0.1:3004 weight=4;    }    ...    server {    listen       80;    server_name  load_balance.com www.load_balance.com;    location / {       proxy_pass http://load_rule;    }}
我在本地/etc/hosts目錄下配置了 www.load_balance.com的虛擬域名地址,接下來使用Go語言開啟四個http端口監聽服務,下面是監聽在3001端口的Go程序,其他幾個只需要修改端口即可:

package mainimport (  "net/http"  "os"  "strings")func main() {  http.HandleFunc("/buy/ticket", handleReq)  http.ListenAndServe(":3001", nil)}//處理請求函數,根據請求將響應結果信息寫入日志func handleReq(w http.ResponseWriter, r *http.Request) {  failedMsg :=  "handle in port:"  writeLog(failedMsg, "./stat.log")}//寫入日志func writeLog(msg string, logPath string) {  fd, _ := os.OpenFile(logPath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644)  defer fd.Close()  content := strings.Join([]string{msg, "
"}, "3001")  buf := []byte(content)  fd.Write(buf)}
我將請求的端口日志信息寫到了./stat.log文件當中,然后使用ab壓測工具做壓測:

ab -n 1000 -c 100 http://www.load_balance.com/buy/ticket
統計日志中的結果,3001-3004端口分別得到了100、200、300、400的請求量,這和我在nginx中配置的權重占比很好的吻合在了一起,并且負載后的流量非常的均勻、隨機。具體的實現大家可以參考nginx的upsteam模塊實現源碼,這里推薦一篇文章:Nginx 中 upstream 機制的負載均衡

https://www.kancloud.cn/digest/understandingnginx/202607

2.秒殺搶購系統選型

回到我們最初提到的問題中來:火車票秒殺系統如何在高并發情況下提供正常、穩定的服務呢?

從上面的介紹我們知道用戶秒殺流量通過層層的負載均衡,均勻到了不同的服務器上,即使如此,集群中的單機所承受的QPS也是非常高的。如何將單機性能優化到極致呢?

要解決這個問題,我們就要想明白一件事:通常訂票系統要處理生成訂單、減扣庫存、用戶支付這三個基本的階段,我們系統要做的事情是要保證火車票訂單不超賣、不少賣,每張售賣的車票都必須支付才有效,還要保證系統承受極高的并發。

這三個階段的先后順序改怎么分配才更加合理呢?我們來分析一下:

2.1 下單減庫存

當用戶并發請求到達服務端時,首先創建訂單,然后扣除庫存,等待用戶支付。

這種順序是我們一般人首先會想到的解決方案,這種情況下也能保證訂單不會超賣,因為創建訂單之后就會減庫存,這是一個原子操作。

但是這樣也會產生一些問題

第一就是在極限并發情況下,任何一個內存操作的細節都至關影響性能,尤其像創建訂單這種邏輯,一般都需要存儲到磁盤數據庫的,對數據庫的壓力是可想而知的;

第二是如果用戶存在惡意下單的情況,只下單不支付這樣庫存就會變少,會少賣很多訂單,雖然服務端可以限制IP和用戶的購買訂單數量,這也不算是一個好方法。

49bb0e2c-247b-11ed-ba43-dac502259ad0.jpg

2.2 支付減庫存

如果等待用戶支付了訂單在減庫存,第一感覺就是不會少賣。但是這是并發架構的大忌,因為在極限并發情況下,用戶可能會創建很多訂單,當庫存減為零的時候很多用戶發現搶到的訂單支付不了了,這也就是所謂的“超賣”。也不能避免并發操作數據庫磁盤IO

49c69184-247b-11ed-ba43-dac502259ad0.jpg

2.3 預扣庫存

從上邊兩種方案的考慮,我們可以得出結論:只要創建訂單,就要頻繁操作數據庫IO。那么有沒有一種不需要直接操作數據庫IO的方案呢,這就是預扣庫存。先扣除了庫存,保證不超賣,然后異步生成用戶訂單,這樣響應給用戶的速度就會快很多;

那么怎么保證不少賣呢?用戶拿到了訂單,不支付怎么辦?我們都知道現在訂單都有有效期,比如說用戶五分鐘內不支付,訂單就失效了,訂單一旦失效,就會加入新的庫存,這也是現在很多網上零售企業保證商品不少賣采用的方案。

訂單的生成是異步的,一般都會放到MQ、kafka這樣的即時消費隊列中處理,訂單量比較少的情況下,生成訂單非常快,用戶幾乎不用排隊。

49cfd0be-247b-11ed-ba43-dac502259ad0.jpg

3. 扣庫存的藝術

從上面的分析可知,顯然預扣庫存的方案最合理。我們進一步分析扣庫存的細節,這里還有很大的優化空間,庫存存在哪里?怎樣保證高并發下,正確的扣庫存,還能快速的響應用戶請求?

在單機低并發情況下,我們實現扣庫存通常是這樣的: 49db31b6-247b-11ed-ba43-dac502259ad0.jpg ? 為了保證扣庫存和生成訂單的原子性,需要采用事務處理,然后取庫存判斷、減庫存,最后提交事務,整個流程有很多IO,對數據庫的操作又是阻塞的。這種方式根本不適合高并發的秒殺系統。 ? 接下來我們對單機扣庫存的方案做優化:本地扣庫存。我們把一定的庫存量分配到本地機器,直接在內存中減庫存,然后按照之前的邏輯異步創建訂單。改進過之后的單機系統是這樣的: ? 49e6b464-247b-11ed-ba43-dac502259ad0.jpg ? 這樣就避免了對數據庫頻繁的IO操作,只在內存中做運算,極大的提高了單機抗并發的能力。但是百萬的用戶請求量單機是無論如何也抗不住的,雖然nginx處理網絡請求使用epoll模型,c10k的問題在業界早已得到了解決。 ? 但是linux系統下,一切資源皆文件,網絡請求也是這樣,大量的文件描述符會使操作系統瞬間失去響應。上面我們提到了nginx的加權均衡策略,我們不妨假設將100W的用戶請求量平均均衡到100臺服務器上,這樣單機所承受的并發量就小了很多。

然后我們每臺機器本地庫存100張火車票,100臺服務器上的總庫存還是1萬,這樣保證了庫存訂單不超賣,下面是我們描述的集群架構: 49f300a2-247b-11ed-ba43-dac502259ad0.jpg ? 問題接踵而至,在高并發情況下,現在我們還無法保證系統的高可用,假如這100臺服務器上有兩三臺機器因為扛不住并發的流量或者其他的原因宕機了。那么這些服務器上的訂單就賣不出去了,這就造成了訂單的少賣。 ? 要解決這個問題,我們需要對總訂單量做統一的管理,這就是接下來的容錯方案。服務器不僅要在本地減庫存,另外要遠程統一減庫存。有了遠程統一減庫存的操作,我們就可以根據機器負載情況,為每臺機器分配一些多余的“buffer庫存”用來防止機器中有機器宕機的情況。我們結合下面架構圖具體分析一下: ? 49ff1388-247b-11ed-ba43-dac502259ad0.jpg ? 我們采用Redis存儲統一庫存,因為Redis的性能非常高,號稱單機QPS能抗10W的并發。在本地減庫存以后,如果本地有訂單,我們再去請求redis遠程減庫存,本地減庫存和遠程減庫存都成功了,才返回給用戶搶票成功的提示,這樣也能有效的保證訂單不會超賣。 ? 當機器中有機器宕機時,因為每個機器上有預留的buffer余票,所以宕機機器上的余票依然能夠在其他機器上得到彌補,保證了不少賣。 ? buffer余票設置多少合適呢,理論上buffer設置的越多,系統容忍宕機的機器數量就越多,但是buffer設置的太大也會對redis造成一定的影響。 ? 雖然redis內存數據庫抗并發能力非常高,請求依然會走一次網絡IO,其實搶票過程中對redis的請求次數是本地庫存和buffer庫存的總量,因為當本地庫存不足時,系統直接返回用戶“已售罄”的信息提示,就不會再走統一扣庫存的邏輯,這在一定程度上也避免了巨大的網絡請求量把redis壓跨,所以buffer值設置多少,需要架構師對系統的負載能力做認真的考量。 ?

4. 代碼演示

Go語言原生為并發設計,我采用go語言給大家演示一下單機搶票的具體流程。

4.1 初始化工作

go包中的init函數先于main函數執行,在這個階段主要做一些準備性工作。我們系統需要做的準備工作有:初始化本地庫存、初始化遠程redis存儲統一庫存的hash鍵值、初始化redis連接池;

另外還需要初始化一個大小為1的int類型chan,目的是實現分布式鎖的功能,也可以直接使用讀寫鎖或者使用redis等其他的方式避免資源競爭,但使用channel更加高效,這就是go語言的哲學:不要通過共享內存來通信,而要通過通信來共享內存。

redis庫使用的是redigo,下面是代碼實現:


...//localSpike包結構體定義package localSpiketype LocalSpike struct {  LocalInStock     int64  LocalSalesVolume int64}...//remoteSpike對hash結構的定義和redis連接池package remoteSpike//遠程訂單存儲健值type RemoteSpikeKeys struct {  SpikeOrderHashKey string  //redis中秒殺訂單hash結構key  TotalInventoryKey string  //hash結構中總訂單庫存key  QuantityOfOrderKey string  //hash結構中已有訂單數量key}//初始化redis連接池func NewPool() *redis.Pool {  return &redis.Pool{    MaxIdle:   10000,    MaxActive: 12000, // max number of connections    Dial: func() (redis.Conn, error) {      c, err := redis.Dial("tcp", ":6379")      if err != nil {        panic(err.Error())      }      return c, err    },  }}...func init() {  localSpike = localSpike2.LocalSpike{    LocalInStock:     150,    LocalSalesVolume: 0,  }  remoteSpike = remoteSpike2.RemoteSpikeKeys{    SpikeOrderHashKey:  "ticket_hash_key",    TotalInventoryKey:  "ticket_total_nums",    QuantityOfOrderKey: "ticket_sold_nums",  }  redisPool = remoteSpike2.NewPool()  done = make(chan int, 1)  done <- 1}

4.2 本地扣庫存和統一扣庫存

本地扣庫存邏輯非常簡單,用戶請求過來,添加銷量,然后對比銷量是否大于本地庫存,返回bool值:


package localSpike//本地扣庫存,返回bool值func (spike *LocalSpike) LocalDeductionStock() bool{  spike.LocalSalesVolume = spike.LocalSalesVolume + 1  return spike.LocalSalesVolume < spike.LocalInStock}
注意這里對共享數據LocalSalesVolume的操作是要使用鎖來實現的,但是因為本地扣庫存和統一扣庫存是一個原子性操作,所以在最上層使用channel來實現,這塊后邊會講。 統一扣庫存操作redis,因為redis是單線程的,而我們要實現從中取數據,寫數據并計算一些列步驟,我們要配合lua腳本打包命令,保證操作的原子性:

package remoteSpike......const LuaScript = `        local ticket_key = KEYS[1]        local ticket_total_key = ARGV[1]        local ticket_sold_key = ARGV[2]        local ticket_total_nums = tonumber(redis.call('HGET', ticket_key, ticket_total_key))        local ticket_sold_nums = tonumber(redis.call('HGET', ticket_key, ticket_sold_key))    -- 查看是否還有余票,增加訂單數量,返回結果值       if(ticket_total_nums >= ticket_sold_nums) then            return redis.call('HINCRBY', ticket_key, ticket_sold_key, 1)        end        return 0`//遠端統一扣庫存func (RemoteSpikeKeys *RemoteSpikeKeys) RemoteDeductionStock(conn redis.Conn) bool {  lua := redis.NewScript(1, LuaScript)  result, err := redis.Int(lua.Do(conn, RemoteSpikeKeys.SpikeOrderHashKey, RemoteSpikeKeys.TotalInventoryKey, RemoteSpikeKeys.QuantityOfOrderKey))  if err != nil {    return false  }  return result != 0}
我們使用hash結構存儲總庫存和總銷量的信息,用戶請求過來時,判斷總銷量是否大于庫存,然后返回相關的bool值。在啟動服務之前,我們需要初始化redis的初始庫存信息:

 hmset ticket_hash_key "ticket_total_nums" 10000 "ticket_sold_nums" 0

4.3 響應用戶信息

我們開啟一個http服務,監聽在一個端口上:


package main...func main() {  http.HandleFunc("/buy/ticket", handleReq)  http.ListenAndServe(":3005", nil)}
上面我們做完了所有的初始化工作,接下來handleReq的邏輯非常清晰,判斷是否搶票成功,返回給用戶信息就可以了。

package main//處理請求函數,根據請求將響應結果信息寫入日志func handleReq(w http.ResponseWriter, r *http.Request) {  redisConn := redisPool.Get()  LogMsg := ""  <-done  //全局讀寫鎖  if localSpike.LocalDeductionStock() && remoteSpike.RemoteDeductionStock(redisConn) {    util.RespJson(w, 1,  "搶票成功", nil)    LogMsg = LogMsg + "result:1,localSales:" + strconv.FormatInt(localSpike.LocalSalesVolume, 10)  } else {    util.RespJson(w, -1, "已售罄", nil)    LogMsg = LogMsg + "result:0,localSales:" + strconv.FormatInt(localSpike.LocalSalesVolume, 10)  }  done <- 1
  //將搶票狀態寫入到log中  writeLog(LogMsg, "./stat.log")}func writeLog(msg string, logPath string) {  fd, _ := os.OpenFile(logPath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644)  defer fd.Close()  content := strings.Join([]string{msg, "
"}, "")  buf := []byte(content)  fd.Write(buf)}
前邊提到我們扣庫存時要考慮競態條件,我們這里是使用channel避免并發的讀寫,保證了請求的高效順序執行。我們將接口的返回信息寫入到了./stat.log文件方便做壓測統計。

4.4 單機服務壓測

開啟服務,我們使用ab壓測工具進行測試:


ab -n 10000 -c 100 http://127.0.0.1:3005/buy/ticket
下面是我本地低配mac的壓測信息

This is ApacheBench, Version 2.3 <$Revision: 1826891 $>Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking 127.0.0.1 (be patient)Completed 1000 requestsCompleted 2000 requestsCompleted 3000 requestsCompleted 4000 requestsCompleted 5000 requestsCompleted 6000 requestsCompleted 7000 requestsCompleted 8000 requestsCompleted 9000 requestsCompleted 10000 requestsFinished 10000 requestsServer Software:Server Hostname:        127.0.0.1Server Port:            3005Document Path:          /buy/ticketDocument Length:        29 bytesConcurrency Level:      100Time taken for tests:   2.339 secondsComplete requests:      10000Failed requests:        0Total transferred:      1370000 bytesHTML transferred:       290000 bytesRequests per second:    4275.96 [#/sec] (mean)Time per request:       23.387 [ms] (mean)Time per request:       0.234 [ms] (mean, across all concurrent requests)Transfer rate:          572.08 [Kbytes/sec] receivedConnection Times (ms)              min  mean[+/-sd] median   maxConnect:        0    8  14.7      6     223Processing:     2   15  17.6     11     232Waiting:        1   11  13.5      8     225Total:          7   23  22.8     18     239Percentage of the requests served within a certain time (ms)  50%     18  66%     24  75%     26  80%     28  90%     33  95%     39  98%     45  99%     54 100%    239 (longest request)
根據指標顯示,我單機每秒就能處理4000+的請求,正常服務器都是多核配置,處理1W+的請求根本沒有問題。而且查看日志發現整個服務過程中,請求都很正常,流量均勻,redis也很正常:


//stat.log...result:1,localSales:145result:1,localSales:146result:1,localSales:147result:1,localSales:148result:1,localSales:149result:1,localSales:150result:0,localSales:151result:0,localSales:152result:0,localSales:153result:0,localSales:154result:0,localSales:156...

5.總結回顧

總體來說,秒殺系統是非常復雜的。我們這里只是簡單介紹模擬了一下單機如何優化到高性能,集群如何避免單點故障,保證訂單不超賣、不少賣的一些策略,完整的訂單系統還有訂單進度的查看,每臺服務器上都有一個任務,定時的從總庫存同步余票和庫存信息展示給用戶,還有用戶在訂單有效期內不支付,釋放訂單,補充到庫存等等。 我們實現了高并發搶票的核心邏輯,可以說系統設計的非常的巧妙,巧妙的避開了對DB數據庫IO的操作,對Redis網絡IO的高并發請求,幾乎所有的計算都是在內存中完成的,而且有效的保證了不超賣、不少賣,還能夠容忍部分機器的宕機。我覺得其中有兩點特別值得學習總結:

負載均衡,分而治之。通過負載均衡,將不同的流量劃分到不同的機器上,每臺機器處理好自己的請求,將自己的性能發揮到極致,這樣系統的整體也就能承受極高的并發了,就像工作的的一個團隊,每個人都將自己的價值發揮到了極致,團隊成長自然是很大的。

合理的使用并發和異步。自epoll網絡架構模型解決了c10k問題以來,異步越來被服務端開發人員所接受,能夠用異步來做的工作,就用異步來做,在功能拆解上能達到意想不到的效果,這點在nginx、node.js、redis上都能體現,他們處理網絡請求使用的epoll模型,用實踐告訴了我們單線程依然可以發揮強大的威力。服務器已經進入了多核時代,go語言這種天生為并發而生的語言,完美的發揮了服務器多核優勢,很多可以并發處理的任務都可以使用并發來解決,比如go處理http請求時每個請求都會在一個goroutine中執行,總之:怎樣合理的壓榨CPU,讓其發揮出應有的價值,是我們一直需要探索學習的方向。

審核編輯:彭靜
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 服務器
    +關注

    關注

    12

    文章

    9227

    瀏覽量

    85620
  • 軟件
    +關注

    關注

    69

    文章

    4968

    瀏覽量

    87686
  • 單機
    +關注

    關注

    0

    文章

    16

    瀏覽量

    6295

原文標題:秒殺系統的架構(Golang 實現)

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    FPGA_ASIC高性能數字系統設計

    FPGA/ASIC高性能數字系統設計 狀態機與數據路徑 1 有限狀態機 1.1 基本概念 1.2 狀態機分類 1.3 狀態機描述方法 1.4 狀態機的編碼風格 1.5 可綜合的fsm編碼 1.6
    發表于 03-02 09:35

    HBase性能優化方法總結

    對于寫密集型提高性能需盡量減少刷寫、合并和拆分的次數,以減少IO壓力,提高系統性能。除了以上方法可以提高HBase性能之外,還可以采用以下方法:1. JVM垃圾回收優化;2. 本地me
    發表于 04-20 17:16

    優化了功率級的20位1MSPS高性能數據采集系統

    描述該適用于高性能數據采集 (DAQ) 系統的參考設計優化了功率級,以降低功耗并最大程度地減小開關穩壓器的 EMI 影響(通過使用 LMS3635-Q1 降壓轉換器)。與 LM53635 降壓轉換器
    發表于 12-05 13:56

    高性能DAQ系統的ADC電壓基準兩級緩沖器優化設計

    描述適用于高性能 DAQ 系統的 TIDA-01055 參考設計優化了 ADC 基準緩沖器,以提高 SNR 性能并降低功耗(使用 TI OPA837 高速運算放大器)。該器件用于復合緩
    發表于 12-07 11:51

    C波段超高性能微波天線的饋源系統的設計方法介紹

      本文介紹了用于微波接力天線饋源中的C波段超高性能饋源系統的設計方法,利用高頻結構仿真軟件對其進行了優化設計。對一些重要的和不易調整的尺寸用加偏差的方法來確定加工精度。計算結果與實測結果吻合的較好
    發表于 06-11 07:14

    高性能ADC助力ATE系統提升

    高性能 ADC 使 ATE 系統準確達到全新水平
    發表于 07-31 14:22

    如何在電源轉換應用中實現高性能、成本優化型實時控制設計?

    如何在電源轉換應用中實現高性能、成本優化型實時控制設計
    發表于 03-16 07:56

    求大佬分享一種優化高性能高可靠性的嵌入式大屏幕LED顯示系統

    本文提出一種優化高性能高可靠性的嵌入式大屏幕LED顯示系統,只需要用1片FPGA和2片SRAM就可以實現大屏幕LED顯示的驅動和內容更換,可以說其性能已經大有改善。本設計可以應對多種
    發表于 06-04 06:02

    電源系統優化系列——如何分析高性能信號鏈中電源紋波

    在電源系統優化"系列文章的 第1部分 ,我們介紹了如何量化電源噪聲靈敏度,以及如何將這些量值與信號鏈中產生的實際影響聯系起來。有人問到:高性能模擬信號處理器件要實現出色性能,真正的噪聲
    發表于 07-03 07:00

    AutoKernel高性能算子自動優化工具

    主要由資深HPC工程師(高性能計算優化工程師)進行開發,為了加快開發進程,縮短深度學習應用落地周期,自動化算子優化是一個趨勢。AutoKernel是由OPEN AI LAB提出的高性能
    發表于 12-14 06:18

    ARM性能庫入門(單機版)

    ARM性能庫為ARM處理器上的高性能計算應用程序提供優化的標準核心數學庫。 可通過Fortran和C接口訪問的庫例程包括: ·BLAS-基本線性代數子程序(包括XBLAS、擴展精度BLAS
    發表于 08-25 06:36

    高性能紙幣處理系統設計的仿真優化資料說明

    為了幫助全世界的現金中心安全地清分與處理紙幣,德國捷德貨幣技術公司的工程師與物理學家使用多物理場仿真開發了磁性、光學與超聲傳感器,從而對采用模塊化設計的高性能紙幣處理系統進行了優化
    的頭像 發表于 02-23 10:57 ?3429次閱讀

    阿里的秒殺系統是如何設計的?

    阿里的秒殺系統是怎么設計的?,服務器,redis,調用,后端
    的頭像 發表于 02-20 11:23 ?1965次閱讀
    阿里的<b class='flag-5'>秒殺</b><b class='flag-5'>系統</b>是如何設計的?

    如何優化DCS系統性能

    工作狀態。選擇高性能的處理器、大容量內存、高速硬盤以及可靠的通訊模塊,以提高系統的運行速度和響應能力。對于老化或故障的設備,及時更換或修理。 硬件參數設置 :通過合理設置硬件參數和優化硬件配置,進一步提高
    的頭像 發表于 11-13 09:19 ?542次閱讀

    如何優化MEMS設計以提高性能

    優化MEMS(微機電系統)設計以提高性能是一個復雜且多維的任務,涉及多個學科和技術的綜合應用。以下是一些關鍵的優化策略和方法: 一、系統級設
    的頭像 發表于 11-20 10:21 ?440次閱讀
    主站蜘蛛池模板: 三叶草成人| 牢记永久免费网址| 久久99re66热这里只有精品| 日韩欧美一区二区三区在线| 24小时日本在线电影| 久久精品中文騷妇女内射| 小骚妇BBBXXX| 国产精品99亚发布| 色色色999| 国产69精品久久久久乱码| 秋霞影音先锋一区二区| younv 学生国产在线视频| 青柠电影在线看| 百性阁论坛首页| 日韩欧美一区二区三区免费看 | 国产成人免费视频| 色欲蜜臀AV免费视频| 国产成人免费高清视频| 无人影院在线播放| 国产全部视频列表支持手机| 亚洲 视频 在线 国产 精品| 国产在线精品亚洲第一区| 亚洲欧美一区二区三区蜜芽| 久cao在线香蕉| 91亚洲精品福利在线播放| 破女在线观看视频| 国产成人高清精品免费观看| 亚洲 国产 日韩 欧美 在线| 精品视频免费在线观看| 538prom国产在线视频一区| 欧美成人免费观看久久| 攻把受做得合不拢腿play| 午夜想想爱午夜剧场| 久久re亚洲在线视频| 99精品免费久久久久久久久日本 | 一攻多受高h大总攻| 美女扒开尿孔| 高h 纯肉文| 亚洲视频在线观看免费| 免费看毛片的网址| 国产精品视频人人做人人爽|