Memcached - 统计信息
Memcached - 使用 Stats 监控
Section titled “Memcached - 使用 Stats 监控”stats 命令是一个强大的诊断工具(diagnostic tool),它提供了关于 Memcached 服务器性能和状态的各种指标(metrics)。监控这些统计数据对于理解缓存行为、诊断问题和优化性能至关重要。
您可以通过 telnet 连接并运行以下命令来获取一般统计信息:
stats示例输出和关键指标解释
Section titled “示例输出和关键指标解释”stats 命令会生成一个包含大量键值对的列表。以下是一些最重要的指标及其含义:
STAT cmd_get 8734STAT cmd_set 1245STAT get_hits 7988STAT get_misses 746STAT evictions 152STAT curr_items 980STAT total_items 1245STAT bytes 874320STAT curr_connections 10STAT total_connections 54STAT rusage_user 0.542012STAT rusage_system 0.899345ENDcmd_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 客户端获取统计信息”客户端库提供了获取和解析这些统计数据的方法,使您能够将监控和警报功能构建到您的应用程序中。
1. 添加依赖
Section titled “1. 添加依赖”确保您的 Maven pom.xml 中包含 spymemcached 依赖:
<dependency> <groupId>net.spy</groupId> <artifactId>spymemcached</artifactId> <version>2.12.3</version></dependency>2. Java 代码示例
Section titled “2. Java 代码示例”此示例不是打印原始的统计数据映射,而是检索统计数据,计算缓存命中率,并以清晰、易于阅读的格式显示几个关键指标。
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: 8734Total Get Hits: 7988Current Items in Cache: 980Total Items Evicted: 152Total Connections since start: 54