OS: Tuning Manajemen Memory
Sumber: http://doc.opensuse.org/documentation/html/openSUSE/opensuse-tuning/cha.tuning.memory.html
Untuk mengerti dan men-tune perilaku manajemen memory di kernel, akan sangat penting untuk mengetahui bagaimana cara dia bekerja dengan subsistem lainnya.
Subsistem menajemen memory, biasa di sebut virtual memory manager, yang selanjutnya akan di sebut "VM". Fungsi VM adalah untuk mengatur alokasi dari memory fisik (RAM) untuk seluruh kernel dan user program. VM juga bertanggung jawab untuk memberikan lingkungan virtual memory untuk keperluan user (di managed melalui API POSIX dengan extensi Linux). Terakhir, VM bertanggung jawab untuk membebaskan RAM jika terjadi kekurangan, baik dengan memotong cache atau swapping "anonymous" memory.
Hal paling penting untuk dimengerti ketika mempelajari dan men-tune VM adalah bagaimana cache di manaje. Tujuan utama VM cache adalah untuk meminimalkan cost dai I/O yang di sebabkan oleh swaping dan operasi file sistem (termasuk network file system). Hal ini dapat dicapai dengan menghindari I/O secara keseluruhan, atau dengan memasukan I/O ke pola yang lebih baik.
Free memory akan digunakan dan di isi oleh cache jika dibutuhkan. Semakin banyak memory yang tersedia untuk cache dan anonymous memory, semakin effektif operasi cache dan swapping. Akan tetapi, jika terjadi kekurangan memory, cache akan dipangkas atau memory akan di swap-kan.
Untuk beban kerja tertentu, hal pertama yang dapat dilakukan untuk memperbaiki performance adalah menaikan memory dan mengurangi frekuensi dimana memory harus dipangkas atau di swap-kan. Hal kedua adalah ubah cara mengatur cache dengan mengubah parameter kernel.
Terakhir, beban kerja itu sendiri harus dipelajari dan di tune. Jika aplikasi di ijinkan untuk menjalankan lebih banyak proses atau thread, effektifitas cache VM akan berkurang, jika setiap proses beroperasi di wilayah-nya sendiri di file system. Overhead memory akan bertambah. Jika aplikasi meng-alokasikan sendiri buffer atau cache yang digunakan, semakin besar cache berarti lebih sedikit memory yang tersedia untuk cache VM. Akan tetapi, semakin banyak proses dan thread juga berarti lebih banyak kemungkinan untuk overlap dan pipeline I/O, dan akan lebih baik dalam mengambil manfaat dari multiple core. Experimen perlu dilakukan untuk memperoleh hasil yang terbaik.
Penggunaan Memory
Alokasi memory secara umum dapat di lihat sebagai "pinned" (juga dikenal sebagai “unreclaimable”), “reclaimable” atau “swappable”.
Anonymous Memory
Anonymous memory cenderung merupakan program heap dan stack memory (contoh, >malloc()). Memory ini reclaimable, kecuali kasus khusus seperti mlock atau jika tidak tersedia space swap. Anonymous memory harus di tulis ke swap sebelum dia dapat di reclaim. Swap I/O (baik swapping in dan swapping out page) cenderung untuk tidak effisien daripada pagecache I/O, karena allocation dan pola akses.
Pagecache
Cache dari file data. Juga sebuah file di baca (read) dari disk atau network, isi akan di simpan di pagecache. AKses ke disk dan network tidak dibutuhkan, jika isi pagecache up-to-date. tmpfs dan segmen shared memory bertumpu pada pagecache.
Ketika sebuah file di tulis (write), data yang baru di simpan di pagecache sebelum di tulis kembali ke disk atau network (membuat dia menjadi write-back cache). Juga pada page ada data baru yang belum di tulis kembali (write back), ini di sebut "dirty". Page yang tidak diklasifikasikan sebagai dirty adalah "clean". Pagecache yang clean akan di reclaim jika terjadi kekurangan memory dengan cara membebaskan mereka. Page dirty harus di clean terlebih dulu sebelum bisa di reclaim.
Buffercache
Ini adalah tipe pagecache untuk block device (seperti, /dev/sda). Sebuah file sistem biasanya menggunakan buffercache pada saat mengakses struktur "meta-data" di disk seperti tabel inode, alokasi bitmap, dan sebagainya. Buffercache dapat di reclaim seperti halnya pagecache.
Buffer Heads
Buffer heads adalah sebuah struktur tambahan kecil yang biasanya dibuat saat akses pagecache. Ini biasanya dapat dengan mudah di reclaim ketika page pagecache atau buffercache sudah clean.
Writeback
Saat aplikasi menulis (write) ke file, pagecache (dan buffercache) menjadi dirty. Ketiga page dirty untuk selang waktu yang ditentukan, atau ketika jumlah memory dirty mencapai persentase tertentu dari RAM, kernel akan mulai melakukan writeback. Memaksa thread untuk melakukan writeback di background dan mengijinkan agar aplikasi tetap berjalan. Jika I/O tidak dapat mengikuti aplikasi dalam membuat dirty pagecache, dan data dirty mencapai persentasi kritis dari RAM, maka aplikasi mulai dikurangi kecepatannya untuk menjaga data dirty tidak melebihi batas.
Readahead
VM akan memperhatikan pola akses file dan akan berusaha uantuk melakukan readahead (membaca duluan). Readahead membaca page dari file system dan masukan pagecache walaupun belum di request. Ini dilakukan untuk memungkinkan lebih sedikit, I/O request yang besar untuk dimasukan (sehingga lebih effisien). Dan agar I/O lebih pipeline (I/O dilakukan pada saat yang sama saat aplikasi berjalan).
VFS caches
Inode Cache
Ini adalah in-memory cache dari structure inode untuk setiap file system. Disini berisi atribut seperti file size, permission (ijin) dan ownership (kepemilikan), dan pointer ke data file.
Directory Entry Cache
Ini adalah in-memory cache dari directory entry di sistem. Ini berisi nama (nama file), dan inode yang nunjuk pada file tersebut, dan children entry. Cache ini digunakan saat kita mengakses struktur directiry dan mengakses file menggunakan nama.
Menguragi Pengunaan Memory
Mengurangi Penggunaan malloc (Anonymous)
Aplikasi jalan di linux yang baru biasanya dapat mengalokasikan lebih banyak memory di bandingkan dengan yang lama. Ini karena glibc mengubah perilaku defaultnya saat mengalokasikan memory userspace. Ada baiknya membaca-baca http://www.gnu.org/s/libc/manual/html_node/Malloc-Tunable-Parameters.html untuk lebih jelasnya.
Untuk mengembalikan ke perilaku yang lama, M_MMAP_THRESHOLD harus di set ke 128*1024. Ini dapat dilakukan dengan call mallopt() dari aplikasi, atau memlalui setting variable environment MALLOC_MMAP_THRESHOLD sebelum aplikasi di jalankan.
15.2.2. Reducing Kernel Memory Overheads
Kernel memory that is reclaimable (caches, described above) will be trimmed automatically during memory shortages. Most other kernel memory can not be easily reduced but is a property of the workload given to the kernel.
Reducing the requirements of the userspace workload will reduce the kernel memory usage (fewer processes, fewer open files and sockets, etc.)
15.2.3. Memory Controller (Memory Cgroups)
If the memory cgroups feature is not needed, it can be switched off by passing cgroup_disable=memory on the kernel command line, reducing memory consumption of the kernel a bit.
15.3. Virtual Memory Manager (VM) Tunable Parameters
When tuning the VM it should be understood that some of the changes will take time to affect the workload and take full effect. If the workload changes throughout the day, it may behave very differently at different times. A change that increases throughput under some conditions may decrease it under other conditions.
15.3.1. Reclaim Ratios
/proc/sys/vm/swappiness
This control is used to define how aggressively the kernel swaps out anonymous memory relative to pagecache and other caches. Increasing the value increases the amount of swapping. The default value is 60.
Swap I/O tends to be much less efficient than other I/O. However, some pagecache pages will be accessed much more frequently than less used anonymous memory. The right balance should be found here.
If swap activity is observed during slowdowns, it may be worth reducing this parameter. If there is a lot of I/O activity and the amount of pagecache in the system is rather small, or if there are large dormant applications running, increasing this value might improve performance.
Note that the more data is swapped out, the longer the system will take to swap data back in when it is needed.
/proc/sys/vm/vfs_cache_pressure
This variable controls the tendency of the kernel to reclaim the memory which is used for caching of VFS caches, versus pagecache and swap. Increasing this value increases the rate at which VFS caches are reclaimed.
It is difficult to know when this should be changed, other than by experimentation. The slabtop command (part of the package procps) shows top memory objects used by the kernel. The vfs caches are the "dentry" and the "*_inode_cache" objects. If these are consuming a large amount of memory in relation to pagecache, it may be worth trying to increase pressure. Could also help to reduce swapping. The default value is 100.
/proc/sys/vm/min_free_kbytes
This controls the amount of memory that is kept free for use by special reserves including “atomic” allocations (those which cannot wait for reclaim). This should not normally be lowered unless the system is being very carefully tuned for memory usage (normally useful for embedded rather than server applications). If “page allocation failure” messages and stack traces are frequently seen in logs, min_free_kbytes could be increased until the errors disappear. There is no need for concern, if these messages are very infrequent. The default value depends on the amount of RAM.
15.3.2. Writeback Parameters
One important change in writeback behavior since openSUSE 10 is that modification to file-backed mmap() memory is accounted immediately as dirty memory (and subject to writeback). Whereas previously it would only be subject to writeback after it was unmapped, upon an msync() system call, or under heavy memory pressure.
Some applications do not expect mmap modifications to be subject to such writeback behavior, and performance can be reduced. Berkeley DB (and applications using it) is one known example that can cause problems. Increasing writeback ratios and times can improve this type of slowdown.
/proc/sys/vm/dirty_background_ratio
This is the percentage of the total amount of free and reclaimable memory. When the amount of dirty pagecache exceeds this percentage, writeback threads start writing back dirty memory. The default value is 10 (%).
/proc/sys/vm/dirty_ratio
Similar percentage value as above. When this is exceeded, applications that want to write to the pagecache are blocked and start performing writeback as well. The default value is 40 (%).
These two values together determine the pagecache writeback behavior. If these values are increased, more dirty memory is kept in the system for a longer time. With more dirty memory allowed in the system, the chance to improve throughput by avoiding writeback I/O and to submitting more optimal I/O patterns increases. However, more dirty memory can either harm latency when memory needs to be reclaimed or at data integrity (sync) points when it needs to be written back to disk.
15.3.3. Readahead parameters
/sys/block/<bdev>/queue/read_ahead_kb
If one or more processes are sequentially reading a file, the kernel reads some data in advance (ahead) in order to reduce the amount of time that processes have to wait for data to be available. The actual amount of data being read in advance is computed dynamically, based on how much "sequential" the I/O seems to be. This parameter sets the maximum amount of data that the kernel reads ahead for a single file. If you observe that large sequential reads from a file are not fast enough, you can try increasing this value. Increasing it too far may result in readahead thrashing where pagecache used for readahead is reclaimed before it can be used, or slowdowns due to a large amount of useless I/O. The default value is 512 (kb).
15.3.4. Further VM Parameters
For the complete list of the VM tunable parameters, see /usr/src/linux/Documentation/sysctl/vm.txt (available after having installed the kernel-source package).
15.4. Non-Uniform Memory Access (NUMA)
Another increasingly important role of the VM is to provide good NUMA allocation strategies. NUMA stands for non-uniform memory access, and most of today's multi-socket servers are NUMA machines. NUMA is a secondary concern to managing swapping and caches in terms of performance, and there are lots of documents about improving NUMA memory allocations. One particular parameter interacts with page reclaim:
/proc/sys/vm/zone_reclaim_mode
This parameter controls whether memory reclaim is performed on a local NUMA node even if there is plenty of memory free on other nodes. This parameter is automatically turned on on machines with more pronounced NUMA characteristics.
If the VM caches are not being allowed to fill all of memory on a NUMA machine, it could be due to zone_reclaim_mode being set. Setting to 0 will disable this behavior.
15.5. Monitoring VM Behavior
Some simple tools that can help monitor VM behavior:
- vmstat: This tool gives a good overview of what the VM is doing. See Section 2.1.1, “vmstat” for details.
- /proc/meminfo: This file gives a detailed breakdown of where memory is being used. See Section 2.4.2, “Detailed Memory Usage: /proc/meminfo” for details.
- slabtop: This tool provides detailed information about kernel slab memory usage. buffer_head, dentry, inode_cache, ext3_inode_cache, etc. are the major caches. This command is available with the package procps
Referensi
Pranala Menarik
- Linux
- Ubuntu
- Sistem Operasi
- Linux: Instalasi Sistem Operasi
- Linux: Skema Partisi di Linux
- Kernel
- Compile Kernel
- Compile Kernel: Konfigurasi Kernel
- Kernel: Anatomi Kernel Source
- OS: Linux Kernel
- OS: Parameter Kernel Default
- OS: Kernel Scheduler
- OS: Complete Teori Tuning Kernel Scheduler
- OS: Complete Teori Tuning I/O Performance
- OS: Tuning Manajemen Memory
- OS: Tuning Kernel Scheduler
- OS: Tuning Completely Fair Queueing CFQ I/O scheduler
- OS: Tuning Completely Fair scheduler CFS
- OS: Build in Monitoring Tool
- Linux Benchmarking
- OS: Benchmarking menggunakan UnixBench
- OS: Benchmarking menggunakan LLCBench
- OS: Mengerti System Call
- OS: Membuat Kernel Modul
- OS: Android - Download