Difference between revisions of "OS: Tuning Manajemen Memory"

From OnnoWiki
Jump to navigation Jump to search
 
(29 intermediate revisions by the same user not shown)
Line 39: Line 39:
 
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.
 
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.
  
===15.1.6. Readahead===
+
===Readahead===
  
The VM monitors file access patterns and may attempt to perform readahead. Readahead reads pages into the pagecache from the file system that have not been requested yet. It is done in order to allow fewer, larger I/O requests to be submitted (more efficient). And for I/O to be pipelined (I/O performed at the same time as the application is running).
+
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).
  
===15.1.7. VFS caches===
+
===VFS caches===
  
====15.1.7.1. Inode Cache====
+
====Inode Cache====
  
This is an in-memory cache of the inode structures for each file system. These contain attributes such as the file size, permissions and ownership, and pointers to the file data.
+
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.
  
====15.1.7.2. Directory Entry Cache====
+
====Directory Entry Cache====
  
This is an in-memory cache of the directory entries in the system. These contain a name (the name of a file), the inode which it refers to, and children entries. This cache is used when traversing the directory structure and accessing a file by name.
+
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.
  
==15.2. Reducing Memory Usage==
+
==Mengurangi Penggunaan Memory==
  
===15.2.1. Reducing malloc (Anonymous) Usage===
+
===Mengurangi Penggunaan malloc (Anonymous)===
  
Applications running on openSUSE 12.3 can allocate more memory compared to openSUSE 10. This is due to glibc changing its default behavior while allocating userspace memory. Please see http://www.gnu.org/s/libc/manual/html_node/Malloc-Tunable-Parameters.html for explanation of these parameters.
+
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.
  
To restore a openSUSE 10-like behavior, M_MMAP_THRESHOLD should be set to 128*1024. This can be done with mallopt() call from the application, or via setting MALLOC_MMAP_THRESHOLD environment variable before running the application.
+
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===
+
===Mengurangi Overhead Kernel Memory===
  
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.
+
Kernel memory yang dapat di reclaim (cache seperti di jelaskan di atas) dapat di pangkas secara automatis saat terjadi kekurangan memory. Kebanyakan kernel memory tidak dengan mudah untuk dikurangi tapi ini merupakan bagian dari beban kerja yang diberikan pada kernel.
  
Reducing the requirements of the userspace workload will reduce the kernel memory usage (fewer processes, fewer open files and sockets, etc.)
+
Mengurangi kebutuhan dari beban kerja user akan mengurangi penggunaan memory kernel (lebih sedikit proses, lebih sedikit file dan soket yang terbuka, dll).
  
===15.2.3. Memory Controller (Memory Cgroups)===
+
===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.
+
Jika fitur memory cgroups tidak dibutuhkan, dia dapat dimatikan dengan cara mengirimkan  cgroup_disable=memory di kernel command line. Ini akan mengurangi sedikit penggunaan memory di kernel.
  
 +
==Parameter Virtual Memory Manager (VM) yang dapat di Tune==
  
 +
Saat kita men-tune VM perlu kita sadari bahwa perubahan yang terjadi akan membutuhkan waktu untuk mempengaruhi beban kerja dan untuk berefek secara maksimum. Jika beban kerja berubah-ubah, maka perilaku akan berbeda-beda dari waktu ke waktu. Perubahan yang menyebabkan throughput membaik dalam satu kondisi mungkin akan menjadi buruk di kondisi yang lain.
  
==15.3. Virtual Memory Manager (VM) Tunable Parameters==
+
===Perbandingan Reclaim===
  
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.
+
'''/proc/sys/vm/swappiness'''
 
 
===15.3.1. Reclaim Ratios===
 
  
'''/proc/sys/vm/swappiness'''
+
Parameter ini mengontrol tingkat agresif kernel untuk melakukan swap out anonymous memory relatif terhadap pagecache dan cache lainnya. Menaikan nilai ini akan menaikan jumlah memory anonymous yang di swap. Nilai default adalah 60.
  
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 cenderung tidak se-effisien I/O lainnya. Akan tetapi, beberapa pagecache akan di akses lebih sering daripada anonymous memory yang jarang digunakan. Keseimbangan yang tepat perlu dicari disini.  
  
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.
+
Jika aktifitas swap terlihat saat sistem berjalan dengan perlahan, maka ada baiknya mengurangi parameter ini. Jika banyak aktifitas I/O dan besarnya pagecache di sistem terlalu kecil, atau jika banyak aplikasi besar yang running, menaikan nilai ini akan memperbaiki performance.
  
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.
+
Perlu di catat bahwa lebih banyak data yang di swap, lebih lama waktu yang dibutuhkan sistem untuk men-swap data kembali saat dibutuhkan.
  
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'''
 
'''/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.
+
Parameter ini mengontrol tendensi kernel untuk me-reclaim memory yang digunakan untuk cache VFS, versus pagecache dan swap. Menaikan nilai ini akan menaikan kecepatan VFS cache di reclaim.
 +
 
 +
Sulit untuk mengetahui kapan parameter ini harus diubah, kecuali melalui experimen. Perintah slabtop (bagian dari paket procps) akan memperlihatkan top memory object yang digunakan oleh kernel. vfs cache adalah object "dentry" dan "*_inode_cache". Jika ini mengkonsumsi memory yang besar relatif terhadap pagecache, maka ada baiknya kita naikan nilai pressure. Juga ada baiknya dicoba untuk mengurangi swapping. Nilai default adalah 100.
  
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'''
 
'''/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.  
+
Parameter ini mengontrol jumlah memory yang harus bebas (free) untuk digunakan untuk aplikasi khusus termasuk yang "atomic" (yang tidak bisa menunggu reclaim). Parameter ini sebaiknya tidak di kecilkan kecuali sistem di tune secara seksama untuk penggunaan memory (ini terutama berguna di aplikasi embedded dibandingkan server). Jika ada message “page allocation failure” dan jejak stack sering terlihat di log, min_free_kbytes dapat di naikan sampai error hilang. Tidak ada yang perlu di kuatirkan, jika message tersebut jarang keluat. Nilai default tergantung dari jumlam RAM.
  
===15.3.2. Writeback Parameters===
+
===Parameter Writeback===
  
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.
+
Perubahan perilaku writeback terutama ke memory mmap() akan di lihat langsung sebagai memory dirty (yang akan diperhitungkan untuk di writeback). Sedang sebelumnya, hanya akan di perhitungkan untuk di writeback, sesudah di unmapped, oleh sistem call msync(), atau di bawah tekanan memory yang sangat berat.
  
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.
+
Beberapa aplikasi tidak berharap adanya modifikasi mmap dan mengalami perilaku writeback yang baru, dan performance dapat berkurang. Berkeley DB (dan aplikasi yang menggunakannya) adalah salah satu contoh yang diketahui dapat menyebabkan masalah. Menaikan perbandingan dan waktu writeback dan akan memperbaiki slowdown yang seperti ini.
  
 
'''/proc/sys/vm/dirty_background_ratio'''
 
'''/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 (%).  
+
Ini ada persentase dari total free dan reclaimable memory. Jika jumlah dari pagecache dirty melebihi persentase ini, thread writeback akan mulai write back memory dirty. Nilai default adalah 10 (%).
  
 
'''/proc/sys/vm/dirty_ratio'''
 
'''/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 (%).  
+
Sama denga nilai persentase di ats. Jika nilai ini dilalui, aplikasi yang akan write ke pagecache akan di blokir dan mulai melakukan writeback juga. Nilai default adalah 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.
+
Kedua nilai ini secara bersama menentukan perilaku pagecache writeback. Jika nilai ini di naikan, akan lebih banyak memory dirty yang di simpan di sistem untuk waktu yang lebih lama. Dengan lebih banyak memory dirty yang ada di sistem, kemungkinan untuk memperbaiki throughput dengan menghindari I/O writeback dan memberikan pola I/O yang lebih baik akan meningkat. Akan tetapi, dengan lebih banyak memory dirty akan menyebabkan latency ketika memory perlu di reclaim atau saat integritas data (sync) perlu di tulis kembali ke disk.
  
===15.3.3. Readahead parameters===
+
===Parameter Readahead===
  
 
'''/sys/block/<bdev>/queue/read_ahead_kb'''
 
'''/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).  
+
Jika satu atau lebih proses secara berurutan membaca (read) sebuah file, kernel akan membaca beberapa data lebih dulu (ahead) untuk mengurangi waktu tunggu proses agar data tersedia. Banyaknya data yang dibaca terlebih dulu di hitung secara dinamik, tergantung seberapa "urut" proses I/O tersebut. Parameter ini menset jumlah data maksimum yang dapat di baca oleh kernel dari sebuah file. Jika kita melihat pembacaan berurut dari sebuah file tidak cukup cepat, kita dapat mencoba menaikan nilai ini. Menaikan nilai ini terlalu besar akan menyebabkan readahead membuat sampah pada pagecache yang digunakan, karena readahead akan di reclaim sebelum digunakan, atau menjadi lambat karena jumlah I/O yang percuma. Nilai default adalah 512 (kb).
  
===15.3.4. Further VM Parameters===
+
===Lebih Lanjut Tentang Parameter VM===
  
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).
+
Untuk daftar lengkap dari parameter VM yang dapat di tune, ada baiknya melihat isi file
  
 +
/usr/src/linux/Documentation/sysctl/vm.txt
  
==15.4. Non-Uniform Memory Access (NUMA)==
+
yang tersedia juga anda menginstalasi source code kernel, atau pakey kernel-source.
  
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:
+
==Non-Uniform Memory Access (NUMA)==
 +
 
 +
Salah satu fungsi VM yang semakin penting adalah memberikan strategi alokasi NUMA yang baik. NUMA singkatan dari non-uniform memory access, dan sebagian besar multi-socket server hari ini adalah mesin NUMA. NUMA adalah perhatian kedua dalam mengatur swapping dan cache khususnya untuk performance. Aada banyak dokumen yang menjelaskan tentang bagaimana memperbaiki alokasi memory NUMA. Salah satu parameter yang berinteraksi dengan reclaim page adalah:
  
 
'''/proc/sys/vm/zone_reclaim_mode'''
 
'''/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.
+
Parameter ini mengontrol apakah memory reclaim di lakukan di node lokal NUMA meskipun banyak memory free di node lainnya. Parameter ini secara automatis akan diaktifkan pada mesin yang mempunya NUMA karakteristik yang menonjol.
 
 
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:
+
Jika cache VM tidak di ijinkan untuk mengisi semua memory di mesin NUMA, itu kemungkinan karena zone_reclaim_mode di set. Menset ke 0 akan mematikan perlaku ini.
  
* vmstat: This tool gives a good overview of what the VM is doing. See Section 2.1.1, “vmstat” for details.
+
==Monitoring Perilaku VM==
  
* /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.
+
Ada beberapa tool sederhana yang dapat digunakan untuk monitor perilaku VM:
  
* 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
+
* vmstat: tool ini memberikan ringkasan yang baik tentang apa yang terjadi di VM.
  
 +
* /proc/meminfo: File ini memberikan detail kemana saja memory digunakan.
  
 +
* slabtop: tool ini memberikan informasi detail tentang penggunaan memory slab kernel. buffer_head, dentry, inode_cache, ext3_inode_cache, dll adalah cache utama. Perintah ini merupakan bagian dari paket procps.
  
 
==Referensi==
 
==Referensi==
  
 
* http://doc.opensuse.org/documentation/html/openSUSE/opensuse-tuning/cha.tuning.memory.html
 
* http://doc.opensuse.org/documentation/html/openSUSE/opensuse-tuning/cha.tuning.memory.html
 +
* http://www.pythian.com/blog/the-mysterious-world-of-shmmax-and-shmall/
  
 
==Pranala Menarik==
 
==Pranala Menarik==
Line 157: Line 158:
 
* [[Linux]]
 
* [[Linux]]
 
* [[Ubuntu]]
 
* [[Ubuntu]]
 +
* [[Buku Sistem Operasi]]
 +
 +
===Secara Umum===
 +
 
* [[Sistem Operasi]]
 
* [[Sistem Operasi]]
 +
 +
===Instalasi Linux===
 +
 +
* [[Linux: CLI untuk Survival]]
 +
* [[Linux: Skema Partisi di Linux]]
 
* [[Linux: Instalasi Sistem Operasi]]
 
* [[Linux: Instalasi Sistem Operasi]]
* [[Linux: Skema Partisi di Linux]]
+
 
 +
===Compile Kernel===
 +
 
 
* [[Kernel]]
 
* [[Kernel]]
 +
* [[OS: Linux Kernel]]
 +
* [[Kernel: Anatomi Kernel Source]]
 
* [[Compile Kernel]]
 
* [[Compile Kernel]]
 
* [[Compile Kernel: Konfigurasi Kernel]]
 
* [[Compile Kernel: Konfigurasi Kernel]]
* [[Kernel: Anatomi Kernel Source]]
+
 
* [[OS: Linux Kernel]]
+
===Remaster Linux===
 +
 
 +
* [[Cara Cepat Melakukan Remastering Ubuntu]]
 +
 
 +
===Sistem Operasi untuk Embedded===
 +
 
 +
* [[OpenWRT]]
 +
* [[OpenWRT: Download Firmware yang sudah jadi]]
 +
* [[OpenWRT: Source Repository Download]]
 +
* [[OpenWRT: Melihat Daftar Package]]
 +
 
 +
====Membuat Firmware Sendiri====
 +
 
 +
* [[OpenWRT: Build Firmware]]
 +
* [[OpenWRT: Build Firmware Buffalo WZRHPG450H]]
 +
* [[OpenWRT: Build Firmware Buffalo WZRHPG300N]]
 +
* [[OpenWRT: Build Firmware Ubiquiti NanoStation2]]
 +
* [[OpenWRT: Build Firmware Mikrotik RB433]]
 +
* [[OpenWRT: Build Firmware Linksys WRT160NL]]
 +
* [[OpenWRT: Build Firmware Linksys WRT54GL]]
 +
 
 +
====Flash ke Device====
 +
 
 +
* [[OpenWRT: Flash Linksys WRT54GL]]
 +
* [[OpenWRT: Flash Buffalo WZRHP450H]]
 +
* [[OpenWRT: Flash Buffalo WZRHP300N]]
 +
* [[OpenWRT: Flash UBNT NanoStation2]]
 +
 
 +
====Beberapa Tip====
 +
 
 +
* [[OpenWRT: Mikrotik RB433]]
 +
* [[OpenWRT: 3G modem]]
 +
* [[OpenWRT: Build Firmware dengan 3G Modem Support]]
 +
* [[OpenWRT: Setup Firewall]]
 +
* [[OpenWRT: Konfigurasi UBNT NanoStation2 tanpa WebGUI]]
 +
 
 +
===Tuning Kernel===
 +
 
 
* [[OS: Parameter Kernel Default]]
 
* [[OS: Parameter Kernel Default]]
 +
 +
====Tuning Kernel Scheduler====
 +
 
* [[OS: Kernel Scheduler]]
 
* [[OS: Kernel Scheduler]]
 +
* [[OS: Tuning Kernel Scheduler]]
 +
* [[OS: Tuning Completely Fair scheduler CFS]]
 
* [[OS: Complete Teori Tuning Kernel Scheduler]]
 
* [[OS: Complete Teori Tuning Kernel Scheduler]]
 +
 +
====Tuning I/O Scheduler====
 +
 +
* [[OS: Tuning Completely Fair Queueing CFQ I/O scheduler]]
 
* [[OS: Complete Teori Tuning I/O Performance]]
 
* [[OS: Complete Teori Tuning I/O Performance]]
 +
 +
====Tuning Manajemen Memory====
 +
 
* [[OS: Tuning Manajemen Memory]]
 
* [[OS: Tuning Manajemen Memory]]
* [[OS: Tuning Kernel Scheduler]]
+
 
* [[OS: Tuning Completely Fair Queueing CFQ I/O scheduler]]
+
===Android===
* [[OS: Tuning Completely Fair scheduler CFS]]
+
 
 +
* [[OS: Android - Download]]
 +
 
 +
===Membuat Kernel Module===
 +
 
 +
* [[OS: Mengerti System Call]]
 +
* [[OS: Membuat Kernel Modul]]
 +
 
 +
===Monitoring & Benchmark===
 +
 
 
* [[OS: Build in Monitoring Tool]]
 
* [[OS: Build in Monitoring Tool]]
 
* [[Linux Benchmarking]]
 
* [[Linux Benchmarking]]
 
* [[OS: Benchmarking menggunakan UnixBench]]
 
* [[OS: Benchmarking menggunakan UnixBench]]
 
* [[OS: Benchmarking menggunakan LLCBench]]
 
* [[OS: Benchmarking menggunakan LLCBench]]
* [[OS: Mengerti System Call]]
 
* [[OS: Membuat Kernel Modul]]
 
* [[OS: Android - Download]]
 

Latest revision as of 04:17, 6 April 2014

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.

Mengurangi Penggunaan 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.

Mengurangi Overhead Kernel Memory

Kernel memory yang dapat di reclaim (cache seperti di jelaskan di atas) dapat di pangkas secara automatis saat terjadi kekurangan memory. Kebanyakan kernel memory tidak dengan mudah untuk dikurangi tapi ini merupakan bagian dari beban kerja yang diberikan pada kernel.

Mengurangi kebutuhan dari beban kerja user akan mengurangi penggunaan memory kernel (lebih sedikit proses, lebih sedikit file dan soket yang terbuka, dll).

Memory Controller (Memory Cgroups)

Jika fitur memory cgroups tidak dibutuhkan, dia dapat dimatikan dengan cara mengirimkan cgroup_disable=memory di kernel command line. Ini akan mengurangi sedikit penggunaan memory di kernel.

Parameter Virtual Memory Manager (VM) yang dapat di Tune

Saat kita men-tune VM perlu kita sadari bahwa perubahan yang terjadi akan membutuhkan waktu untuk mempengaruhi beban kerja dan untuk berefek secara maksimum. Jika beban kerja berubah-ubah, maka perilaku akan berbeda-beda dari waktu ke waktu. Perubahan yang menyebabkan throughput membaik dalam satu kondisi mungkin akan menjadi buruk di kondisi yang lain.

Perbandingan Reclaim

/proc/sys/vm/swappiness

Parameter ini mengontrol tingkat agresif kernel untuk melakukan swap out anonymous memory relatif terhadap pagecache dan cache lainnya. Menaikan nilai ini akan menaikan jumlah memory anonymous yang di swap. Nilai default adalah 60.

Swap I/O cenderung tidak se-effisien I/O lainnya. Akan tetapi, beberapa pagecache akan di akses lebih sering daripada anonymous memory yang jarang digunakan. Keseimbangan yang tepat perlu dicari disini.

Jika aktifitas swap terlihat saat sistem berjalan dengan perlahan, maka ada baiknya mengurangi parameter ini. Jika banyak aktifitas I/O dan besarnya pagecache di sistem terlalu kecil, atau jika banyak aplikasi besar yang running, menaikan nilai ini akan memperbaiki performance.

Perlu di catat bahwa lebih banyak data yang di swap, lebih lama waktu yang dibutuhkan sistem untuk men-swap data kembali saat dibutuhkan.


/proc/sys/vm/vfs_cache_pressure

Parameter ini mengontrol tendensi kernel untuk me-reclaim memory yang digunakan untuk cache VFS, versus pagecache dan swap. Menaikan nilai ini akan menaikan kecepatan VFS cache di reclaim.

Sulit untuk mengetahui kapan parameter ini harus diubah, kecuali melalui experimen. Perintah slabtop (bagian dari paket procps) akan memperlihatkan top memory object yang digunakan oleh kernel. vfs cache adalah object "dentry" dan "*_inode_cache". Jika ini mengkonsumsi memory yang besar relatif terhadap pagecache, maka ada baiknya kita naikan nilai pressure. Juga ada baiknya dicoba untuk mengurangi swapping. Nilai default adalah 100.


/proc/sys/vm/min_free_kbytes

Parameter ini mengontrol jumlah memory yang harus bebas (free) untuk digunakan untuk aplikasi khusus termasuk yang "atomic" (yang tidak bisa menunggu reclaim). Parameter ini sebaiknya tidak di kecilkan kecuali sistem di tune secara seksama untuk penggunaan memory (ini terutama berguna di aplikasi embedded dibandingkan server). Jika ada message “page allocation failure” dan jejak stack sering terlihat di log, min_free_kbytes dapat di naikan sampai error hilang. Tidak ada yang perlu di kuatirkan, jika message tersebut jarang keluat. Nilai default tergantung dari jumlam RAM.

Parameter Writeback

Perubahan perilaku writeback terutama ke memory mmap() akan di lihat langsung sebagai memory dirty (yang akan diperhitungkan untuk di writeback). Sedang sebelumnya, hanya akan di perhitungkan untuk di writeback, sesudah di unmapped, oleh sistem call msync(), atau di bawah tekanan memory yang sangat berat.

Beberapa aplikasi tidak berharap adanya modifikasi mmap dan mengalami perilaku writeback yang baru, dan performance dapat berkurang. Berkeley DB (dan aplikasi yang menggunakannya) adalah salah satu contoh yang diketahui dapat menyebabkan masalah. Menaikan perbandingan dan waktu writeback dan akan memperbaiki slowdown yang seperti ini.

/proc/sys/vm/dirty_background_ratio

Ini ada persentase dari total free dan reclaimable memory. Jika jumlah dari pagecache dirty melebihi persentase ini, thread writeback akan mulai write back memory dirty. Nilai default adalah 10 (%).

/proc/sys/vm/dirty_ratio

Sama denga nilai persentase di ats. Jika nilai ini dilalui, aplikasi yang akan write ke pagecache akan di blokir dan mulai melakukan writeback juga. Nilai default adalah 40 (%).

Kedua nilai ini secara bersama menentukan perilaku pagecache writeback. Jika nilai ini di naikan, akan lebih banyak memory dirty yang di simpan di sistem untuk waktu yang lebih lama. Dengan lebih banyak memory dirty yang ada di sistem, kemungkinan untuk memperbaiki throughput dengan menghindari I/O writeback dan memberikan pola I/O yang lebih baik akan meningkat. Akan tetapi, dengan lebih banyak memory dirty akan menyebabkan latency ketika memory perlu di reclaim atau saat integritas data (sync) perlu di tulis kembali ke disk.

Parameter Readahead

/sys/block/<bdev>/queue/read_ahead_kb

Jika satu atau lebih proses secara berurutan membaca (read) sebuah file, kernel akan membaca beberapa data lebih dulu (ahead) untuk mengurangi waktu tunggu proses agar data tersedia. Banyaknya data yang dibaca terlebih dulu di hitung secara dinamik, tergantung seberapa "urut" proses I/O tersebut. Parameter ini menset jumlah data maksimum yang dapat di baca oleh kernel dari sebuah file. Jika kita melihat pembacaan berurut dari sebuah file tidak cukup cepat, kita dapat mencoba menaikan nilai ini. Menaikan nilai ini terlalu besar akan menyebabkan readahead membuat sampah pada pagecache yang digunakan, karena readahead akan di reclaim sebelum digunakan, atau menjadi lambat karena jumlah I/O yang percuma. Nilai default adalah 512 (kb).

Lebih Lanjut Tentang Parameter VM

Untuk daftar lengkap dari parameter VM yang dapat di tune, ada baiknya melihat isi file

/usr/src/linux/Documentation/sysctl/vm.txt

yang tersedia juga anda menginstalasi source code kernel, atau pakey kernel-source.

Non-Uniform Memory Access (NUMA)

Salah satu fungsi VM yang semakin penting adalah memberikan strategi alokasi NUMA yang baik. NUMA singkatan dari non-uniform memory access, dan sebagian besar multi-socket server hari ini adalah mesin NUMA. NUMA adalah perhatian kedua dalam mengatur swapping dan cache khususnya untuk performance. Aada banyak dokumen yang menjelaskan tentang bagaimana memperbaiki alokasi memory NUMA. Salah satu parameter yang berinteraksi dengan reclaim page adalah:

/proc/sys/vm/zone_reclaim_mode

Parameter ini mengontrol apakah memory reclaim di lakukan di node lokal NUMA meskipun banyak memory free di node lainnya. Parameter ini secara automatis akan diaktifkan pada mesin yang mempunya NUMA karakteristik yang menonjol.

Jika cache VM tidak di ijinkan untuk mengisi semua memory di mesin NUMA, itu kemungkinan karena zone_reclaim_mode di set. Menset ke 0 akan mematikan perlaku ini.

Monitoring Perilaku VM

Ada beberapa tool sederhana yang dapat digunakan untuk monitor perilaku VM:

  • vmstat: tool ini memberikan ringkasan yang baik tentang apa yang terjadi di VM.
  • /proc/meminfo: File ini memberikan detail kemana saja memory digunakan.
  • slabtop: tool ini memberikan informasi detail tentang penggunaan memory slab kernel. buffer_head, dentry, inode_cache, ext3_inode_cache, dll adalah cache utama. Perintah ini merupakan bagian dari paket procps.

Referensi

Pranala Menarik

Secara Umum

Instalasi Linux

Compile Kernel

Remaster Linux

Sistem Operasi untuk Embedded

Membuat Firmware Sendiri

Flash ke Device

Beberapa Tip

Tuning Kernel

Tuning Kernel Scheduler

Tuning I/O Scheduler

Tuning Manajemen Memory

Android

Membuat Kernel Module

Monitoring & Benchmark