This can be very useful if you want to maintain a cache but you don't want to exceed a certain size of memory.
To register a threshold application need:
- create an eventfd using eventfd(2);
- open memory.usage_in_bytes or memory.memsw.usage_in_bytes;
- write string like "<event_fd> <fd of memory.usage_in_bytes> <threshold>"
... // Open cgroup file (e.g. "memory.oom_control" or "memory.usage_in_byte") snprintf(path, PATH_MAX, "%s/%s", cgroup, file); cgroup_ctrl->fd = open(path, O_RDONLY); cgroup_ctrl->efd = eventfd(0, 0); // Prepare ctrl_string e.g. // <event_fd> <fd of memory.oom_control> // <event_fd> <fd of memory.usage_in_bytes> <threshold> snprintf(ctrl_string, CTRL_STRING_MAX, "%d %d", cgroup_ctrl->efd, cgroup_ctrl->fd); // Write ctrl_string to cgroup event_control snprintf(path, PATH_MAX, "%s/cgroup.event_control", cgroup); fd = open(path, O_WRONLY); write(fd, ctrl_string, strlen(ctrl_string)); close(fd); ...Now you can add eventfd() descriptor to your epoll()/select() event loop and wait your notification. Here, you can handle your cache release.
... nfds = epoll_wait(epfd, events, NEVENTS, TIMEOUT); for (i = 0; i < nfds; ++i) { if (events[i].data.fd == cgroup_ctrl->efd) { /* Memory Threshold Notification */ read(cgroup_ctrl->efd, &result, sizeof(uint64_t)); /* free some memory */ } } ...A full demo source code is avable on github at cgroup-mem-threshold demo.
No comments:
Post a Comment