用在多个glance API server 中,对相同的image文件提供服务。该cache对用户透明。
配置文件有一个image_cache_max_size,超过的话image cache会被修剪pruner.
然而,当GET /images/<IMAGE_ID>成功返回一个image时,不管是否超cache,该image都会写入到cache中。
实践中,一般都cron来运行glance-cache-pruner。
glance cache工具有:
1. glance-cache-cleaner
随着时间推移,image cache中会有一些Stalled和Invalid image。
Stalled image是image没有完全写入到cache,invalid是没有正确的写入到disk中。
可以cron 运行 glance-cache-cleaner。
2. glance-cache-manage
3. glance-cache-prefetcher
先把热点image queued起来,放到queue中。
- 如果enable了 cache_manage middleware 可以PUT /queued-images/<IMAGE_ID>
- 或者可以使用glance-cache-manage,该命令还可以其他host来运行。
$> glance-cache-manage --host=<HOST> queue-image <IMAGE_ID>
Queue image 6ee64b2e-48e3-4dc9-8c43-bc5a4ccc12a9 for caching? [y/N] yqueue/└── 6ee64b2e-48e3-4dc9-8c43-bc5a4ccc12a9
仅仅是在queue目录下touch一个文件
一旦queued images,就可以prefetch,运行glance-cache-prefetcher,其可以并行的prefetch所有的queued images。
class Prefetcher:def run(self):查看queue中的image每个image启动一个eventlet运行self.fetch_image_into_cache 分chunk读入到/opt/stack/data/glance/cache/incomplete完成后,移入到/opt/stack/data/glance/cache/ 并且删除queue/
ll -sh incomplete/6ee64b2e-48e3-4dc9-8c43-bc5a4ccc12a9 1.6G -rw-rw-r-- 1 yuntong yuntong 1.6G 10月 14 15:21 incomplete/6ee64b2e-48e3-4dc9-8c43-bc5a4ccc12a9
4. glance-cache-pruner
3种方法list image cache中的images:
1. 如果enable了 cache_manage middleware,可以 GET/cached-images
2. 使用glance-cache-manage
$> glance-cache-manage --host=<HOST> list-cached
3.直接查看cache目录
$> ls -lhR $IMAGE_CACHE_DIR
在devstack中,image_cache_dir = /opt/stack/data/glance/cache/
手动移除cache中的image
1. 如果enable了 cache_manage middleware, DELETE /cached-images/<IMAGE_ID>
2.使用 glance-cache-manage
$> glance-cache-manage --host=<HOST> delete-cached-image <IMAGE_ID>
cache的driver有2种:
1. sqlite, cache信息存在DB中:
cur = db.execute("""SELECT
image_id, hits, last_accessed, last_modified, size FROM cached_images ORDER BY image_id""")def get_cache_size(self):计算目录大小/opt/stack/data/glance/cache/def get_hit_count 从DBdef get_cached_images DBdef is_cached 查看文件是否存在def is_queued 是否在/opt/stack/data/glance/cache/queue目录中def is_being_cached 是否在/opt/stack/data/glance/cache/incomplete目录中delete_all_cached_images 删除文件和DB信息def queue_image 在/opt/stack/data/glance/cache/queue touch一个文件和incomplete一起工作,实现commit/rollback2.xattr: cache信息从文件中获取
def get_hit_count
return int(get_xattr(path, 'hits', default=0)) entry['last_modified'] = file_info[stat.ST_MTIME] entry['last_accessed'] = file_info[stat.ST_ATIME] entry['size'] = file_info[stat.ST_SIZE] entry['hits'] = self.get_hit_count(image_id)