2012-11-05 33 views
6

Tôi đang chạy một máy ảo lớn trong sản xuất và muốn hiểu thêm về kích thước bộ nhớ cache của mình khi chạy. Bộ nhớ cache của tôi dựa trên ehacheKích thước bộ nhớ cache Ehcache khi chạy

Cách tốt nhất để xem kích thước của từng bộ đệm riêng lẻ khi chạy. Sử dụng JMX hoặc API

Có tùy chọn nào để định cấu hình bằng các cuộc gọi thuần cũ-java tới CacheManager hay không (bỏ qua JMX cho thời điểm này) phải xây dựng cấu hình XML trong một chuỗi lớn?

Trả lời

10

Có, bằng cách sử dụng Ehcache, bạn có thể cấu hình bộ đệm của bạn và lấy kích thước của chúng chỉ bằng mã Java (không có cấu hình XML). Cách chính xác để tích hợp mọi thứ phụ thuộc vào kiến ​​trúc cụ thể của bạn; Tôi sẽ giả sử Jersey làm công cụ API và Guice để tiêm phụ thuộc.

Xác định bộ nhớ cache

Hãy quản lý bộ nhớ cache của bạn có sẵn thông qua dependency injection. Điều này có thể được thực hiện thông qua mô-đun Guice:

@Provides 
@Singleton 
CacheManager provideCacheManager() { 
    CacheManager cacheManager = CacheManager.create(); 

    /* very basic cache configuration */ 
    CacheConfiguration config = new CacheConfiguration("mycache", 100) 
    .timeToLiveSeconds(60) 
    .timeToIdleSeconds(30) 
    .statistics(true); 

    Cache myCache = new Cache(config); 
    cacheManager.addCacheIfAbsent(myCache); 

    return cacheManager; 
} 

Lưu ý rằng số liệu thống kê được bật cho mycache.

Một lần nữa, việc sử dụng bộ nhớ cache của bạn có thể được thực hiện hoàn toàn bằng mã Java nhưng phụ thuộc vào kiến ​​trúc và thiết kế của bạn. Thông thường tôi làm điều này bằng cách sử dụng phương pháp đánh chặn (thông qua AOP) nhưng đó là một chủ đề khác.

Fetch số liệu thống kê bộ nhớ cache thông qua API REST

Với CacheManager của bạn có sẵn thông qua dependency injection sau đó bạn có thể dây nó lên đến một endpoint REST và cho phép truy cập số liệu thống kê cache:

@Path("stats") 
@Produces("text/plain") 
public class StatsResource { 
    @Inject private CacheManager cacheManager; 

    @GET 
    public String stats() { 
    StringBuffer sb = StringBuffer(); 

    /* get stats for all known caches */ 
    for (String name : cacheManager.getCacheNames()) { 
     Cache cache = cacheManager.getCache(name); 
     Statistics stats = cache.getStatistics(); 

     sb.append(String.format("%s: %s objects, %s hits, %s misses\n", 
     name, 
     stats.getObjectCount(), 
     stats.getCacheHits(), 
     stats.getCacheMisses() 
    )); 
    } 
    return sb.toString(); 
    } 
} 

Bây giờ bạn có thể tìm thông tin về bộ nhớ cache của bạn bằng cách gọi REST:

GET /stats 

HTTP/1.1 200 OK 
Content-Type: text/plain; charset=utf-8 

mycache: 8 objects, 59 hits, 12 misses 

Còn JMX thì sao?

Ehcache giúp bạn dễ dàng đăng ký bộ đệm ẩn với máy chủ MBean. Nó có thể được thực hiện trong mã Java. Cập nhật mô-đun Guice của bạn, đăng ký của bạn cacheManager với hệ thống MBeanServer:

MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); 
ManagementService.registerMBeans(cacheManager, mBeanServer, false, false, false, true); 

Bây giờ bạn có thể đính kèm JConsole để trình Java của bạn và tìm thống kê bộ nhớ cache trong các MBean net.sf.ehcache.CacheStatistics.

+0

Làm cách nào để sử dụng bộ nhớ cache? Từ ví dụ trên - có bao nhiêu byte làm 8 đối tượng chiếm trên heap? Chúng tôi có nhiều trường hợp ehcache và tôi đang tìm một giải pháp cho phép sử dụng bộ nhớ đệm. –

+0

Có vẻ như ehcache bắt đầu từ phiên bản 2.6 cung cấp một cách để cấu hình bộ đệm với maxBytesOnLocalHeap(). Sẽ thuận tiện để tính toán việc sử dụng heap - http://ehcache.org/documentation/2.6/configuration/cache-size # local-heap –

+0

Có vẻ như Ehcache không còn cung cấp getObjectCount() nữa. Có cách nào khác không? – markthegrea

0

JMX chắc chắn là một giải pháp khả thi. Tài liệu EhCache có số page dành riêng cho việc này.

Here's an example định cấu hình EhCache qua JMX. Bài viết được liên kết có chứa cấu hình Spring, nhưng nó dễ dàng dịch sang Java nguyên gốc nếu bạn không sử dụng Spring.

Các vấn đề liên quan