1. 程式人生 > >高效能的分散式記憶體快取伺服器系統——memcached核心原理詳細剖析

高效能的分散式記憶體快取伺服器系統——memcached核心原理詳細剖析

memcached是什麼?

許多Web應用都將資料儲存到RDBMS中,應用伺服器從中讀取資料並在瀏覽器中顯示。 但隨著資料量的增大、訪問的集中,就會出現RDBMS的負擔加重、資料庫響應惡化、 網站顯示延遲等重大影響。

這時就該memcached大顯身手了。memcached是高效能的分散式記憶體快取伺服器。 一般的使用目的是,通過快取資料庫查詢結果,減少資料庫訪問次數,以提高動態Web應用的速度、 提高可擴充套件性。


圖1 一般情況下memcached的用途

memcached的特徵

memcached作為高速執行的分散式快取伺服器,具有以下的特點。

  • 協議簡單
  • 基於libevent的事件處理
  • 內建記憶體儲存方式
  • memcached不互相通訊的分散式

協議簡單

memcached的伺服器客戶端通訊並不使用複雜的XML等格式, 而使用簡單的基於文字行的協議。因此,通過telnet 也能在memcached上儲存資料、取得資料。下面是例子。

$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
set foo 0 0 3 (儲存命令)
bar (資料)
STORED (結果)
get foo (取得命令)
VALUE foo 0 3 (資料)
bar (資料)

協議文件位於memcached的原始碼內,也可以參考以下的URL。

基於libevent的事件處理

libevent是個程式庫,它將Linux的epoll、BSD類作業系統的kqueue等事件處理功能 封裝成統一的介面。即使對伺服器的連線數增加,也能發揮O(1)的效能。 memcached使用這個libevent庫,因此能在Linux、BSD、Solaris等作業系統上發揮其高效能。 關於事件處理這裡就不再詳細介紹,可以參考Dan Kegel的The C10K Problem。

內建記憶體儲存方式

為了提高效能,memcached中儲存的資料都儲存在memcached內建的記憶體儲存空間中。 由於資料僅存在於記憶體中,因此重啟memcached、重啟作業系統會導致全部資料消失。 另外,內容容量達到指定值之後,就基於LRU(Least Recently Used)演算法自動刪除不使用的快取。 memcached本身是為快取而設計的伺服器,因此並沒有過多考慮資料的永久性問題。 關於記憶體儲存的詳細資訊,本連載的第二講以後前阪會進行介紹,請屆時參考。

memcached不互相通訊的分散式

memcached儘管是“分散式”快取伺服器,但伺服器端並沒有分散式功能。 各個memcached不會互相通訊以共享資訊。那麼,怎樣進行分散式呢? 這完全取決於客戶端的實現。本連載也將介紹memcached的分散式。


圖2 memcached的分散式

接下來簡單介紹一下memcached的使用方法。

安裝memcached

memcached的安裝比較簡單,這裡稍加說明。

memcached支援許多平臺。

  • Linux
  • FreeBSD
  • Solaris (memcached 1.2.5以上版本)
  • Mac OS X

另外也能安裝在Windows上。這裡使用Fedora Core 8進行說明。

memcached的安裝

執行memcached需要本文開頭介紹的libevent庫。Fedora 8中有現成的rpm包, 通過yum命令安裝即可。

$ sudo yum install libevent libevent-devel

memcached的原始碼可以從memcached網站上下載。本文執筆時的最新版本為1.2.5。 Fedora 8雖然也包含了memcached的rpm,但版本比較老。因為原始碼安裝並不困難, 這裡就不使用rpm了。

memcached安裝與一般應用程式相同,configure、make、make install就行了。

$ wget http://www.danga.com/memcached/dist/memcached-1.2.5.tar.gz
$ tar zxf memcached-1.2.5.tar.gz
$ cd memcached-1.2.5
$ ./configure
$ make
$ sudo make install

預設情況下memcached安裝到/usr/local/bin下。

memcached的啟動

從終端輸入以下命令,啟動memcached。

$ /usr/local/bin/memcached -p 11211 -m 64m -vv
slab class 1: chunk size 88 perslab 11915
slab class 2: chunk size 112 perslab 9362
slab class 3: chunk size 144 perslab 7281
中間省略
slab class 38: chunk size 391224 perslab 2
slab class 39: chunk size 489032 perslab 2
<23 server listening
<24 send buffer was 110592, now 268435456
<24 server listening (udp)
<24 server listening (udp)
<24 server listening (udp)
<24 server listening (udp)

這裡顯示了除錯資訊。這樣就在前臺啟動了memcached,監聽TCP埠11211 最大記憶體使用量為64M。除錯資訊的內容大部分是關於儲存的資訊, 下次連載時具體說明。

作為daemon後臺啟動時,只需

$ /usr/local/bin/memcached -p 11211 -m 64m -d

這裡使用的memcached啟動選項的內容如下。

選項 說明
-p 使用的TCP埠。預設為11211
-m 最大記憶體大小。預設為64M
-vv 用very vrebose模式啟動,除錯資訊和錯誤輸出到控制檯
-d 作為daemon在後臺啟動

上面四個是常用的啟動選項,其他還有很多,通過

$ /usr/local/bin/memcached -h

命令可以顯示。許多選項可以改變memcached的各種行為, 推薦讀一讀。

用客戶端連線

許多語言都實現了連線memcached的客戶端,其中以Perl、PHP為主。 僅僅memcached網站上列出的語言就有

  • Perl
  • PHP
  • Python
  • Ruby
  • C#
  • C/C++
  • Lua

等等。

這裡介紹通過mixi正在使用的Perl庫連結memcached的方法。

使用Cache::Memcached

Perl的memcached客戶端有

  • Cache::Memcached
  • Cache::Memcached::Fast
  • Cache::Memcached::libmemcached

等幾個CPAN模組。這裡介紹的Cache::Memcached是memcached的作者Brad Fitzpatric的作品, 應該算是memcached的客戶端中應用最為廣泛的模組了。

使用Cache::Memcached連線memcached

下面的原始碼為通過Cache::Memcached連線剛才啟動的memcached的例子。

#!/usr/bin/perl

use strict;
use warnings;
use Cache::Memcached;

my $key = "foo";
my $value = "bar";
my $expires = 3600; # 1 hour
my $memcached = Cache::Memcached->new({
servers => ["127.0.0.1:11211"],
compress_threshold => 10_000
});

$memcached->add($key, $value, $expires);
my $ret = $memcached->get($key);
print "$ret\n";

在這裡,為Cache::Memcached指定了memcached伺服器的IP地址和一個選項,以生成例項。 Cache::Memcached常用的選項如下所示。

選項 說明
servers 用陣列指定memcached伺服器和埠
compress_threshold 資料壓縮時使用的值
namespace 指定新增到鍵的字首

另外,Cache::Memcached通過Storable模組可以將Perl的複雜資料序列化之後再儲存, 因此雜湊、陣列、物件等都可以直接儲存到memcached中。

儲存資料

向memcached儲存資料的方法有

  • add
  • replace
  • set

它們的使用方法都相同:

my $add = $memcached->add( '鍵', '值', '期限' );
my $replace = $memcached->replace( '鍵', '值', '期限' );
my $set = $memcached->set( '鍵', '值', '期限' );

向memcached儲存資料時可以指定期限(秒)。不指定期限時,memcached按照LRU演算法儲存資料。 這三個方法的區別如下:

選項 說明
add 僅當儲存空間中不存在鍵相同的資料時才儲存
replace 僅當儲存空間中存在鍵相同的資料時才儲存
set 與add和replace不同,無論何時都儲存

獲取資料

獲取資料可以使用get和get_multi方法。

my $val = $memcached->get('鍵');
my $val = $memcached->get_multi('鍵1', '鍵2', '鍵3', '鍵4', '鍵5');

一次取得多條資料時使用get_multi。get_multi可以非同步地同時取得多個鍵值, 其速度要比迴圈呼叫get快數十倍。

刪除資料

刪除資料使用delete方法,不過它有個獨特的功能。

$memcached->delete('鍵', '阻塞時間(秒)');

刪除第一個引數指定的鍵的資料。第二個引數指定一個時間值,可以禁止使用同樣的鍵儲存新資料。 此功能可以用於防止快取資料的不完整。但是要注意,set函式忽視該阻塞,照常儲存資料

增一和減一操作

可以將memcached上特定的鍵值作為計數器使用。

my $ret = $memcached->incr('鍵');
$memcached->add('鍵', 0) unless defined $ret;

增一和減一是原子操作,但未設定初始值時,不會自動賦成0。因此, 應當進行錯誤檢查,必要時加入初始化操作。而且,伺服器端也不會對 超過2<sup>32</sup>時的行為進行檢查。

總結

這次簡單介紹了memcached,以及它的安裝方法、Perl客戶端Cache::Memcached的用法。 只要知道,memcached的使用方法十分簡單就足夠了。

 本次將介紹memcached的內部構造的實現方式,以及記憶體的管理方式。 另外,memcached的內部構造導致的弱點也將加以說明。

Slab Allocation機制:整理記憶體以便重複使用

最近的memcached預設情況下采用了名為Slab Allocator的機制分配、管理記憶體。 在該機制出現以前,記憶體的分配是通過對所有記錄簡單地進行malloc和free來進行的。 但是,這種方式會導致記憶體碎片,加重作業系統記憶體管理器的負擔,最壞的情況下, 會導致作業系統比memcached程序本身還慢。Slab Allocator就是為解決該問題而誕生的。

下面來看看Slab Allocator的原理。下面是memcached文件中的slab allocator的目標:

the primary goal of the slabs subsystem in memcached was to eliminate memory fragmentation issues totally by using fixed-size memory chunks coming from a few predetermined size classes.

也就是說,Slab Allocator的基本原理是按照預先規定的大小,將分配的記憶體分割成特定長度的塊, 以完全解決記憶體碎片問題。

Slab Allocation的原理相當簡單。 將分配的記憶體分割成各種尺寸的塊(chunk), 並把尺寸相同的塊分成組(chunk的集合)(圖1)。

圖1 Slab Allocation的構造圖

而且,slab allocator還有重複使用已分配的記憶體的目的。 也就是說,分配到的記憶體不會釋放,而是重複利用。

Slab Allocation的主要術語

Page

分配給Slab的記憶體空間,預設是1MB。分配給Slab之後根據slab的大小切分成chunk。

Chunk

用於快取記錄的記憶體空間。

Slab Class

特定大小的chunk的組。

在Slab中快取記錄的原理

下面說明memcached如何針對客戶端傳送的資料選擇slab並快取到chunk中。

memcached根據收到的資料的大小,選擇最適合資料大小的slab(圖2)。 memcached中儲存著slab內空閒chunk的列表,根據該列表選擇chunk, 然後將資料緩存於其中。

圖2 選擇儲存記錄的組的方法

實際上,Slab Allocator也是有利也有弊。下面介紹一下它的缺點。

Slab Allocator的缺點

Slab Allocator解決了當初的記憶體碎片問題,但新的機制也給memcached帶來了新的問題。

這個問題就是,由於分配的是特定長度的記憶體,因此無法有效利用分配的記憶體。 例如,將100位元組的資料快取到128位元組的chunk中,剩餘的28位元組就浪費了(圖3)。

圖3 chunk空間的使用

對於該問題目前還沒有完美的解決方案,但在文件中記載了比較有效的解決方案。

The most efficient way to reduce the waste is to use a list of size classes that closely matches (if that's at all possible) common sizes of objects that the clients of this particular installation of memcached are likely to store.

就是說,如果預先知道客戶端傳送的資料的公用大小,或者僅快取大小相同的資料的情況下, 只要使用適合資料大小的組的列表,就可以減少浪費。

但是很遺憾,現在還不能進行任何調優,只能期待以後的版本了。 但是,我們可以調節slab class的大小的差別。 接下來說明growth factor選項。

使用Growth Factor進行調優

memcached在啟動時指定 Growth Factor因子(通過-f選項), 就可以在某種程度上控制slab之間的差異。預設值為1.25。 但是,在該選項出現之前,這個因子曾經固定為2,稱為“powers of 2”策略。

讓我們用以前的設定,以verbose模式啟動memcached試試看:

$ memcached -f 2 -vv

下面是啟動後的verbose輸出:

slab class   1: chunk size    128 perslab  8192
slab class 2: chunk size 256 perslab 4096
slab class 3: chunk size 512 perslab 2048
slab class 4: chunk size 1024 perslab 1024
slab class 5: chunk size 2048 perslab 512
slab class 6: chunk size 4096 perslab 256
slab class 7: chunk size 8192 perslab 128
slab class 8: chunk size 16384 perslab 64
slab class 9: chunk size 32768 perslab 32
slab class 10: chunk size 65536 perslab 16
slab class 11: chunk size 131072 perslab 8
slab class 12: chunk size 262144 perslab 4
slab class 13: chunk size 524288 perslab 2

可見,從128位元組的組開始,組的大小依次增大為原來的2倍。 這樣設定的問題是,slab之間的差別比較大,有些情況下就相當浪費記憶體。 因此,為儘量減少記憶體浪費,兩年前追加了growth factor這個選項。

來看看現在的預設設定(f=1.25)時的輸出(篇幅所限,這裡只寫到第10組):

slab class   1: chunk size     88 perslab 11915
slab class 2: chunk size 112 perslab 9362
slab class 3: chunk size 144 perslab 7281
slab class 4: chunk size 184 perslab 5698
slab class 5: chunk size 232 perslab 4519
slab class 6: chunk size 296 perslab 3542
slab class 7: chunk size 376 perslab 2788
slab class 8: chunk size 472 perslab 2221
slab class 9: chunk size 592 perslab 1771
slab class 10: chunk size 744 perslab 1409

可見,組間差距比因子為2時小得多,更適合快取幾百位元組的記錄。 從上面的輸出結果來看,可能會覺得有些計算誤差, 這些誤差是為了保持位元組數的對齊而故意設定的。

將memcached引入產品,或是直接使用預設值進行部署時, 最好是重新計算一下資料的預期平均長度,調整growth factor, 以獲得最恰當的設定。記憶體是珍貴的資源,浪費就太可惜了。

接下來介紹一下如何使用memcached的stats命令檢視slabs的利用率等各種各樣的資訊。

檢視memcached的內部狀態

memcached有個名為stats的命令,使用它可以獲得各種各樣的資訊。 執行命令的方法很多,用telnet最為簡單:

$ telnet 主機名 埠號

連線到memcached之後,輸入stats再按回車,即可獲得包括資源利用率在內的各種資訊。 此外,輸入"stats slabs"或"stats items"還可以獲得關於快取記錄的資訊。 結束程式請輸入quit。

這些命令的詳細資訊可以參考memcached軟體包內的protocol.txt文件。

$ telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
stats
STAT pid 481
STAT uptime 16574
STAT time 1213687612
STAT version 1.2.5
STAT pointer_size 32
STAT rusage_user 0.102297
STAT rusage_system 0.214317
STAT curr_items 0
STAT total_items 0
STAT bytes 0
STAT curr_connections 6
STAT total_connections 8
STAT connection_structures 7
STAT cmd_get 0
STAT cmd_set 0
STAT get_hits 0
STAT get_misses 0
STAT evictions 0
STAT bytes_read 20
STAT bytes_written 465
STAT limit_maxbytes 67108864
STAT threads 4
END
quit

另外,如果安裝了libmemcached這個面向C/C++語言的客戶端庫,就會安裝 memstat 這個命令。 使用方法很簡單,可以用更少的步驟獲得與telnet相同的資訊,還能一次性從多臺伺服器獲得資訊。

$ memstat --servers=server1,server2,server3,...

libmemcached可以從下面的地址獲得:

檢視slabs的使用狀況

使用memcached的創造著Brad寫的名為memcached-tool的Perl指令碼,可以方便地獲得slab的使用情況 (它將memcached的返回值整理成容易閱讀的格式)。可以從下面的地址獲得指令碼:

使用方法也極其簡單:

$ memcached-tool 主機名:埠 選項

檢視slabs使用狀況時無需指定選項,因此用下面的命令即可:

$ memcached-tool 主機名:埠

獲得的資訊如下所示:

 #  Item_Size   Max_age  1MB_pages Count   Full?
1 104 B 1394292 s 1215 12249628 yes
2 136 B 1456795 s 52 400919 yes
3 176 B 1339587 s 33 196567 yes
4 224 B 1360926 s 109 510221 yes
5 280 B 1570071 s 49 183452 yes
6 352 B 1592051 s 77 229197 yes
7 440 B 1517732 s 66 157183 yes
8 552 B 1460821 s 62 117697 yes
9 696 B 1521917 s 143 215308 yes
10 872 B 1695035 s 205 246162 yes
11 1.1 kB 1681650 s 233 221968 yes
12 1.3 kB 1603363 s 241 183621 yes
13 1.7 kB 1634218 s 94 57197 yes
14 2.1 kB 1695038 s 75 36488 yes
15 2.6 kB 1747075 s 65 25203 yes
16 3.3 kB 1760661 s 78 24167 yes

各列的含義為:

含義
# slab class編號
Item_Size Chunk大小
Max_age LRU內最舊的記錄的生存時間
1MB_pages 分配給Slab的頁數
Count Slab內的記錄數
Full? Slab內是否含有空閒chunk

相關推薦

高效能分散式記憶體快取伺服器系統——memcached核心原理詳細剖析

memcached是什麼? 許多Web應用都將資料儲存到RDBMS中,應用伺服器從中讀取資料並在瀏覽器中顯示。 但隨著資料量的增大、訪問的集中,就會出現RDBMS的負擔加重、資料庫響應惡化、 網站顯示延遲等重大影響。 這時就該memcached

Spring Boot整合Hazelcast實現叢集與分散式記憶體快取

Hazelcast是Hazelcast公司開源的一款分散式記憶體資料庫產品,提供彈性可擴充套件、高效能的分散式記憶體計算。並通過提供諸如Map,Queue,ExecutorService,Lock和JCache等Java的許多開發人員友好的分散式實現。 瞭解Hazelcast Hazelcast特性 簡單易

im大型分散式實時計費伺服器系統架構2.0

整個創業團隊後臺就我一個設計,架構,和開發.一路上很辛苦,因為遇到的問題很多很多,並不是想象的那麼簡單.本來2.0想用go語言開發的,簡單,又快,又支援熱更新.處理速度和c++差不多,但靈活度沒有c+

Memcached 分散式記憶體物件快取系統在Java Web專案收藏欄中的使用

Memcached工具類程式碼 import com.danga.MemCached.MemCachedClient; import com.danga.MemCached.SockIOPool; import java.util.ArrayList; import java.util.List; /

.NET下實現分散式快取系統Memcached

IT168 技術文件】在Web應用程式中,資料通常儲存在RDBMS中,應用伺服器從資料庫中讀取資料並在瀏覽器中顯示。但隨著資料量的增大、訪問的集中,就會出現RDBMS的負載加重、資料庫響應變慢、網站顯示延遲等重大影響。為了緩解資料庫的壓力,提升Web應用程式的響應速度,人們提

高效能Redis快取伺服器-redis.conf檔案配置埠號、授權IP、Redis後臺啟動、Redis日誌、Redis密碼

Redis的強大功能依賴於Redis的配置檔案,比如密碼驗證,授權機器訪問,埠號配置,叢集配置等,我們可以通過配置檔案非常方便的對Redis進行配置。Redis的核心配置檔案只有一個,就是redis.conf。在發行包中就有提供。在啟動Redis伺服器的時候我們可以通過redis-server

高效能Redis快取伺服器-單節點環境搭建

Redis是一個高效能的快取伺服器,它能夠支援多種資料型別的快取,定義了非常簡約的通訊協議,多種程式語言都有對應的客戶端支援。Redis使用非常便捷,在應用中也被大量的使用。下面我們來在linux下部署一個單節點的Redis服務。 1. 從官網下載redis的安裝包,下載地址為 redi

php獲取Linux和windos伺服器系統執行資訊指令碼(硬碟使用率和cpu記憶體資訊)

將網上的Linux和Windows獲取系統資訊的方法進行整合,統計當前目錄下的硬碟使用率和cpu記憶體資訊。 <?php /** * 伺服器系統執行資訊 */ $path=__DIR__;//儲存位置" header('content-Type: tex

高效能快取伺服器 nuster v2.0.4.18 釋出

   nuster 是一個基於 HAProxy 的高效能 HTTP 快取伺服器和 RESTful NoSQL 快取伺服器,既可以用作類似 Varnish 或者 Nginx 那樣的 HTTP 快取伺服器,來快取動態或者靜態的 HTTP 資源,也可以用作 RESTful NoSQL

Java:Memcached-----memcached實現記憶體快取

ached是danga.com(運營LiveJournal的技術團隊)開發的一套分散式記憶體物件快取系統,用於在動態系統中減少資料庫負載,提升效能。LJ每秒動態頁面訪問量幾千次,使用者700萬。Memcached將資料庫負載大幅度降低,更好的分配資源,更快速訪問。   

高效能Redis快取伺服器單節點環境搭建

Redis是一個高效能的快取伺服器,它能夠支援多種資料型別的快取,定義了非常簡約的通訊協議,多種程式語言都有對應的客戶端支援。Redis使用非常便捷,在應用中也被大量的使用。下面我們來在linux下部署一個單節點的Redis服務。 1. 從官網下載redis的安裝包,下載地

高效能Redis快取伺服器-redis.conf檔案

Redis的強大功能依賴於Redis的配置檔案,比如密碼驗證,授權機器訪問,埠號配置,叢集配置等,我們可以通過配置檔案非常方便的對Redis進行配置。Redis的核心配置檔案只有一個,就是redis.conf。在發行包中就有提供。在啟動Redis伺服器的時候我們可以通過red

c++記憶體模型------計算機系統核心概念及軟硬體實現

 c++程式語言有3中不同類項的變數:全域性變數、區域性變數和動態分配變數。變數的值儲存在計算機的記憶體中,但是變數儲存的方式取決於變數的類項。3種類型的變數分別對應儲存器中3個特定的區域: 全域性變數存放在儲存器中的固定位置。區域性變數存放在執行時棧上。動態分配變數存放

memcached快取伺服器一致性雜湊分佈部署類

class FlexHash{ private $server_list = array(); private $is_sort = false; public function add_server($server) { $hash = mhas

Beanstalk分散式記憶體佇列系統

Beanstalk是一個高效能、輕量級的、分散式的、記憶體型的訊息佇列系統。最初設計的目的是想通過後臺非同步執行耗時的任務來降低高容量Web應用系統的頁面訪問延遲。其實Beanstalkd是典型的類Memcached設計,協議和使用方式都是同樣的風格。其基本設計思想很簡單:高效能離不開非同步,非同步

FastDFS分散式伺服器系統配置與部署

1、什麼是FastDFS: FastDFS 是用 C 語言編寫的一款開源的分散式檔案系統。FastDFS 為網際網路量身定製, 充分考慮了冗餘備份、負載均衡、線性擴容等機制,並注重高可用、高效能等指標,使用 FastDFS 很容易搭建一套高效能的檔案伺服器叢集提供檔案上傳、下載等

Linux作業系統檢視CPU型號、個數、核數、邏輯CPU數、位數、發行版本、核心資訊、記憶體伺服器生產廠家

Linux下的CPU資訊全部都在/proc/cpuinfo這個檔案中,可以直接開啟看。  # 總核數 = 物理CPU個數 X 每顆物理CPU的核數 # 總邏輯CPU數 = 物理CPU個數 X 每顆物理CPU的核數 X 超執行緒數 判斷是否開啟了超執行緒: 如果多個邏輯CP

分散式快取伺服器設計原理

假設有n臺伺服器, 計算這n臺伺服器的IP地址的雜湊值, 把這些雜湊值從小到大按順時針排列組成一個“伺服器節點環”, 客戶端需要儲存一系列的“鍵值對”到這些伺服器上去, 計算這些“鍵”的雜湊值, 看看這些“鍵”的雜湊值落在“伺服器環”的哪些區間, 如下圖所示: 根據上圖示意,資料將被儲存在“順時針方向上的

高效能代理快取伺服器—Squid

Squid是什麼? Squid是一款比較知名的開源代理快取軟體,它不僅可以跑在linux上還可以跑在windows以及Unix上,它的技術已經非常成熟。目前使用Squid的使用者也是十分廣泛的。 Squid與Linux下其它的代理軟體如Apache、Sock

描述一個高效能高可靠的伺服器架構---------如何設計一個秒殺系統

一、秒殺的應用場景 電商網站的搶購活動、12306網站的搶票、搶紅包。 二、秒殺的特點 1、秒殺時大量使用者會在同一時間同時進行搶購,網站瞬時訪問流量激增。 2、資料庫的併發讀寫衝突以及資源的鎖請求衝突非常嚴重。 3、秒殺一般是訪問請求數量遠遠大於