首頁 資料庫 mysql教程 Memcached全面剖析–2.理解memcached的内存存储

Memcached全面剖析–2.理解memcached的内存存储

Jun 07, 2016 pm 03:00 PM
memcached 全面 剖析 理解

下面是《memcached全面剖析》的第二部分。 发表日:2008/7/9 作者:前坂徹(Toru Maesaka) http://gihyo.jp/dev/feature/01/memcached/0002 我是mixi株式会社研究开发组的前坂徹。上次的文章介绍了memcached是分布式的高速缓存服务器。 本次将介绍memcached的

下面是《memcached全面剖析》的第二部分。

发表日:2008/7/9 
作者:前坂徹(Toru Maesaka) 
http://gihyo.jp/dev/feature/01/memcached/0002

我是mixi株式会社研究开发组的前坂徹。 上次的文章介绍了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)。

Memcached全面剖析–2.理解memcached的内存存储

图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, 然后将数据缓存于其中。

Memcached全面剖析–2.理解memcached的内存存储

图2 选择存储记录的组的方法

实际上,Slab Allocator也是有利也有弊。下面介绍一下它的缺点。

Slab Allocator的缺点

Slab Allocator解决了当初的内存碎片问题,但新的机制也给memcached带来了新的问题。

这个问题就是,由于分配的是特定长度的内存,因此无法有效利用分配的内存。 例如,将100字节的数据缓存到128字节的chunk中,剩余的28字节就浪费了(图3)。

Memcached全面剖析–2.理解memcached的内存存储

图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<br>slab class   2: chunk size    256 perslab  4096<br>slab class   3: chunk size    512 perslab  2048<br>slab class   4: chunk size   1024 perslab  1024<br>slab class   5: chunk size   2048 perslab   512<br>slab class   6: chunk size   4096 perslab   256<br>slab class   7: chunk size   8192 perslab   128<br>slab class   8: chunk size  16384 perslab    64<br>slab class   9: chunk size  32768 perslab    32<br>slab class  10: chunk size  65536 perslab    16<br>slab class  11: chunk size 131072 perslab     8<br>slab class  12: chunk size 262144 perslab     4<br>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<br>slab class   2: chunk size    112 perslab  9362<br>slab class   3: chunk size    144 perslab  7281<br>slab class   4: chunk size    184 perslab  5698<br>slab class   5: chunk size    232 perslab  4519<br>slab class   6: chunk size    296 perslab  3542<br>slab class   7: chunk size    376 perslab  2788<br>slab class   8: chunk size    472 perslab  2221<br>slab class   9: chunk size    592 perslab  1771<br>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<br>Trying ::1...<br>Connected to localhost.<br>Escape character is '^]'.<br>stats<br>STAT pid 481<br>STAT uptime 16574<br>STAT time 1213687612<br>STAT version 1.2.5<br>STAT pointer_size 32<br>STAT rusage_user 0.102297<br>STAT rusage_system 0.214317<br>STAT curr_items 0<br>STAT total_items 0<br>STAT bytes 0<br>STAT curr_connections 6<br>STAT total_connections 8<br>STAT connection_structures 7<br>STAT cmd_get 0<br>STAT cmd_set 0<br>STAT get_hits 0<br>STAT get_misses 0<br>STAT evictions 0<br>STAT bytes_read 20<br>STAT bytes_written 465<br>STAT limit_maxbytes 67108864<br>STAT threads 4<br>END<br>quit
登入後複製

另外,如果安装了libmemcached这个面向C/C++语言的客户端库,就会安装 memstat 这个命令。 使用方法很简单,可以用更少的步骤获得与telnet相同的信息,还能一次性从多台服务器获得信息。

$ memstat --servers=server1,server2,server3,...
登入後複製

libmemcached可以从下面的地址获得:

  • http://tangent.org/552/libmemcached.html

查看slabs的使用状况

使用memcached的创造着Brad写的名为memcached-tool的Perl脚本,可以方便地获得slab的使用情况 (它将memcached的返回值整理成容易阅读的格式)。可以从下面的地址获得脚本:

  • http://code.sixapart.com/svn/memcached/trunk/server/scripts/memcached-tool

使用方法也极其简单:

$ memcached-tool 主机名:端口 选项
登入後複製

查看slabs使用状况时无需指定选项,因此用下面的命令即可:

$ memcached-tool 主机名:端口
登入後複製

获得的信息如下所示:

 #  Item_Size   Max_age  1MB_pages Count   Full?<br> 1     104 B  1394292 s    1215 12249628    yes<br> 2     136 B  1456795 s      52  400919     yes<br> 3     176 B  1339587 s      33  196567     yes<br> 4     224 B  1360926 s     109  510221     yes<br> 5     280 B  1570071 s      49  183452     yes<br> 6     352 B  1592051 s      77  229197     yes<br> 7     440 B  1517732 s      66  157183     yes<br> 8     552 B  1460821 s      62  117697     yes<br> 9     696 B  1521917 s     143  215308     yes<br>10     872 B  1695035 s     205  246162     yes<br>11     1.1 kB 1681650 s     233  221968     yes<br>12     1.3 kB 1603363 s     241  183621     yes<br>13     1.7 kB 1634218 s      94   57197     yes<br>14     2.1 kB 1695038 s      75   36488     yes<br>15     2.6 kB 1747075 s      65   25203     yes<br>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的内存管理原理及其优缺点。

下次将继续说明LRU和Expire等原理,以及memcached的最新发展方向—— 可扩充体系(pluggable architecher))。

原文:http://kb.cnblogs.com/page/42732/;

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
Memcached快取技術對於PHP中的Session處理的最佳化 Memcached快取技術對於PHP中的Session處理的最佳化 May 16, 2023 am 08:41 AM

Memcached是一種常用的快取技術,它可以讓Web應用程式的效能得到很大的提升。在PHP中,常用的Session處理方式是將Session檔案存放在伺服器的硬碟上。但是,這種方式並不是最優的,因為伺服器的硬碟會成為效能瓶頸之一。而使用Memcached快取技術可以對PHP中的Session處理進行最佳化,提升Web應用程式的效能。 PHP中的Session處

如何使用Memcached快取技術優化PHP應用程式CPU的使用率? 如何使用Memcached快取技術優化PHP應用程式CPU的使用率? Jun 21, 2023 pm 05:07 PM

隨著互聯網的發展,PHP應用程式在網路應用領域中變得越來越常見。但是,PHP應用程式的高並發存取會導致伺服器的CPU使用率高,進而影響應用程式的效能。為了優化PHP應用程式的效能,Memcached快取技術成為了一個很好的選擇。本文將介紹如何使用Memcached快取技術最佳化PHP應用程式CPU的使用率。 Memcached快取技術簡介Memcached是一

PHP與Memcached資料庫備份與恢復 PHP與Memcached資料庫備份與恢復 May 15, 2023 pm 09:12 PM

隨著網路的快速發展,大規模MySQL資料庫備份和復原成為各大企業和網站必備的技能之一。而隨著Memcached的廣泛應用,如何備份和還原Memcached也成為了一個重要的問題。 PHP作為Web開發的主力語言之一,在處理備份和復原MySQL和Memcached上擁有獨特的優勢和技巧。本文將詳細介紹PHP處理MySQL與Memcached備份與復原的實作方法

努比亞 Z70 Ultra 預計 12 月發布 搭載 1.5K 螢幕下鏡頭真全面屏 努比亞 Z70 Ultra 預計 12 月發布 搭載 1.5K 螢幕下鏡頭真全面屏 Aug 20, 2024 am 09:37 AM

近日,努比亞Z70Ultra在IMEI資料庫中現身,型號為NX731J。這款手機搭載了新一代屏下相機技術,將成為全球首款搭載驍龍8Gen4處理器的真全面屏旗艦手機,該手機最大的亮點是採用了1.5K分辨率的屏下攝像頭方案,這是目前業界解析度最高的UDC(螢幕下攝影機)技術。先前努比亞已量產第六代螢幕下攝影技術(螢幕解析度為2480×1116,介於FHD和1.5K解析度之間),而Z70Ultra的螢幕解析度提升至1.5K,實現了無瀏海、無挖孔的真全面屏設計。 1.Z70Ultra搭載一吋超大底主攝感

PHP與Memcached效能監控 PHP與Memcached效能監控 May 15, 2023 pm 09:51 PM

隨著現代網路應用的快速發展,使用者體驗對於一個應用程式的成功至關重要。如何確保應用程式的高效能和高可用性,成為了開發人員需要解決的重要問題之一。 PHP作為一種廣泛應用的程式語言之一,它的效能監控和最佳化也是非常重要的。 Memcached是一個高效能、分散式的記憶體物件快取系統,可以幫助應用程式提高效能和擴充性。本文將介紹如何使用PHP和Memcached實現效能監控的方法。

深入剖析MySQL密碼加密方法 深入剖析MySQL密碼加密方法 Jun 15, 2023 pm 09:24 PM

隨著網際網路的發展,MySQL作為一種開源的關係型資料庫管理系統,在各類應用上都有廣泛應用。其中一個重要的安全性問題就是MySQL使用者密碼的加密和儲存。那麼,MySQL密碼加密的方法都有哪些呢?本文將為大家深入剖析。 MySQL密碼的儲存方式在了解MySQL密碼加密方法之前,先來了解MySQL密碼的儲存方式。 MySQL在版本5.7以前,採用的是單向雜湊演算法(S

簡明易懂:深入剖析pip協定的意義 簡明易懂:深入剖析pip協定的意義 Feb 02, 2024 pm 01:10 PM

深入剖析pip協定的意義,需要具體程式碼範例引言:在Python的世界裡,pip(即pipinstall)是我們安裝和管理第三方函式庫的首選方式。它是Python套件管理工具,以其簡潔高效、易用便利的特點,在開發過程中得到了廣泛的應用。本文將深入剖析pip協定的意義,透過具體的程式碼範例,展示pip的重要角色和使用方法,幫助讀者更好地理解和運用pip。一、pip協議

使用PHP和Memcached進行快取管理 使用PHP和Memcached進行快取管理 May 23, 2023 pm 02:21 PM

隨著網路應用的不斷增加和資料量的不斷膨脹,資料的讀寫效率成為影響應用效能的重要因素之一。而快取技術的應用則可以很好地解決這個問題。在PHP應用程式中,Memcached是最常用的快取伺服器。 Memcached是一個高效能的分散式記憶體物件快取系統,可以將常用的資料儲存在記憶體中,提高資料檢索的效率。本文將介紹如何使用PHP和Memcached進行快取管理,以及如何優

See all articles