Skip to content

Memcached - 统计信息

stats 命令是一个强大的诊断工具(diagnostic tool),它提供了关于 Memcached 服务器性能和状态的各种指标(metrics)。监控这些统计数据对于理解缓存行为、诊断问题和优化性能至关重要。

您可以通过 telnet 连接并运行以下命令来获取一般统计信息:

stats

stats 命令会生成一个包含大量键值对的列表。以下是一些最重要的指标及其含义:

STAT cmd_get 8734
STAT cmd_set 1245
STAT get_hits 7988
STAT get_misses 746
STAT evictions 152
STAT curr_items 980
STAT total_items 1245
STAT bytes 874320
STAT curr_connections 10
STAT total_connections 54
STAT rusage_user 0.542012
STAT rusage_system 0.899345
END
  • cmd_get / cmd_set:接收到的 get 和 set 命令总数。有助于理解缓存的读/写比率。
  • get_hits:get 请求找到数据的次数。数值越高越好。
  • get_misses:get 请求未找到数据的次数。这意味着应用程序不得不回退(fall back)到主要数据源(primary data source)(例如数据库)。
  • evictions:由于缓存已满,为新项腾出空间而从缓存中移除的有效、未过期项的数量。高或快速增长的逐出(evictions)数量强烈表明您需要为 Memcached 分配更多内存(allocate more memory)。
  • curr_items:当前缓存中存储的项数。
  • bytes:当前用于存储项的字节数。
  • curr_connections:当前到服务器的开放连接数。
  • 缓存命中率(Cache Hit Ratio):一个关键的性能指标(performance metric),计算公式为:(get_hits / cmd_get) * 100。一个良好的命中率通常高于 90-95%,但这因应用程序而异。

使用现代 Java 客户端获取统计信息

Section titled “使用现代 Java 客户端获取统计信息”

客户端库提供了获取和解析这些统计数据的方法,使您能够将监控和警报功能构建到您的应用程序中。

确保您的 Maven pom.xml 中包含 spymemcached 依赖:

<dependency>
<groupId>net.spy</groupId>
<artifactId>spymemcached</artifactId>
<version>2.12.3</version>
</dependency>

此示例不是打印原始的统计数据映射,而是检索统计数据,计算缓存命中率,并以清晰、易于阅读的格式显示几个关键指标。

import net.spy.memcached.MemcachedClient;
import net.spy.memcached.AddrUtil;
import java.io.IOException;
import java.net.SocketAddress;
import java.util.Map;
public class MemcachedStatsExample {
public static void main(String[] args) {
String serverAddress = "127.0.0.1:11211";
try (MemcachedClient client = new MemcachedClient(AddrUtil.getAddresses(serverAddress))) {
System.out.println("Connection to Memcached server successful.\n");
// getStats() 方法返回一个将服务器地址映射到其统计信息映射的 Map。
Map<SocketAddress, Map<String, String>> stats = client.getStats();
// 遍历每个服务器的统计信息(在此例中只有一个)
for (Map.Entry<SocketAddress, Map<String, String>> entry : stats.entrySet()) {
System.out.println("--- Stats for server: " + entry.getKey() + " ---");
Map<String, String> serverStats = entry.getValue();
// 提取关键指标
long getCmds = Long.parseLong(serverStats.getOrDefault("cmd_get", "0"));
long getHits = Long.parseLong(serverStats.getOrDefault("get_hits", "0"));
long evictions = Long.parseLong(serverStats.getOrDefault("evictions", "0"));
long currItems = Long.parseLong(serverStats.getOrDefault("curr_items", "0"));
long totalConnections = Long.parseLong(serverStats.getOrDefault("total_connections", "0"));
// 计算缓存命中率
double hitRatio = (getCmds == 0) ? 0.0 : ((double) getHits / getCmds) * 100;
// 显示格式化的统计数据
System.out.printf("Cache Hit Ratio: %.2f%%\n", hitRatio);
System.out.printf("Total Get Commands: %d\n", getCmds);
System.out.printf("Total Get Hits: %d\n", getHits);
System.out.printf("Current Items in Cache: %d\n", currItems);
System.out.printf("Total Items Evicted: %d\n", evictions);
System.out.printf("Total Connections since start: %d\n", totalConnections);
}
} catch (IOException e) {
System.err.println("发生错误: " + e.getMessage());
}
}
}

输出将是服务器健康状况的整洁格式化摘要:

Connection to Memcached server successful.
--- Stats for server: /127.0.0.1:11211 ---
Cache Hit Ratio: 91.50%
Total Get Commands: 8734
Total Get Hits: 7988
Current Items in Cache: 980
Total Items Evicted: 152
Total Connections since start: 54