Rumah > Artikel > Operasi dan penyelenggaraan > apa itu linux swap
Linux swap merujuk kepada partition swap Linux, yang merupakan kawasan pada cakera Ia boleh menjadi partition, fail atau gabungan kedua-duanya adalah serupa dengan memori maya Windows, iaitu apabila Apabila memori tidak mencukupi, sebahagian daripada ruang cakera keras dimayakan ke dalam memori untuk menyelesaikan masalah kapasiti memori yang tidak mencukupi.
Persekitaran pengendalian tutorial ini: sistem linux5.9.8, komputer Dell G3.
linux swap
Linux swap partition (swap), atau ruang ganti memori (swap space), ialah kawasan pada cakera , boleh menjadi partition, fail atau gabungan daripadanya.
Fungsi SWAP seperti "memori maya" di bawah sistem Windows. Apabila memori fizikal tidak mencukupi, sebahagian daripada ruang cakera keras digunakan sebagai partition SWAP (hampir ditukar kepada memori) untuk menyelesaikan masalah kapasiti memori yang tidak mencukupi.
SWAP bermaksud swap Seperti namanya, apabila proses meminta memori daripada OS dan mendapati ia tidak mencukupi, OS akan menukar data yang tidak digunakan buat sementara waktu dalam memori dan meletakkannya dalam partition SWAP. Proses ini dipanggil SWAP OUT. Apabila proses memerlukan data ini dan OS mendapati bahawa terdapat memori fizikal percuma, ia akan menukar data dalam partition SWAP kembali kepada memori fizikal Proses ini dipanggil SWAP IN.
Sudah tentu, terdapat had atas pada saiz swap Setelah swap digunakan, sistem pengendalian akan mencetuskan mekanisme OOM-Killer untuk mematikan proses yang menggunakan paling banyak memori untuk melepaskan memori.
Mengapa sistem pangkalan data tidak suka bertukar-tukar?
Jelas sekali, niat asal mekanisme swap adalah untuk mengurangkan rasa malu secara langsung mengasari proses OOM apabila memori fizikal telah habis. Tetapi secara terus terang, hampir semua pangkalan data tidak suka swap, sama ada MySQL, Oracal, MongoDB atau HBase. Ini terutamanya berkaitan dengan dua aspek berikut:
1 Sistem pangkalan data secara amnya sensitif terhadap kelewatan tindak balas Jika swap digunakan dan bukannya memori, prestasi perkhidmatan pangkalan data tidak dapat dielakkan. Untuk sistem yang sangat sensitif terhadap kelewatan respons, tiada perbezaan antara kelewatan yang terlalu banyak dan ketiadaan perkhidmatan Apa yang lebih serius daripada ketiadaan perkhidmatan ialah proses itu tidak akan mati dalam senario pertukaran, yang bermaksud bahawa sistem sentiasa tidak tersedia. ... Fikirkan sekali lagi adakah pilihan yang lebih baik untuk terus oom tanpa menggunakan swap Dengan cara ini, banyak sistem ketersediaan tinggi akan terus bertukar antara tuan dan hamba, dan pengguna pada dasarnya tidak akan menyedarinya.
2. Di samping itu, untuk sistem teragih seperti HBase, kami sebenarnya tidak bimbang tentang nod tertentu akan turun, tetapi kami bimbang tentang nod tertentu tersekat. Jika nod turun, paling banyak sebilangan kecil permintaan akan tidak tersedia buat sementara waktu dan boleh dipulihkan dengan mencuba semula. Walau bagaimanapun, jika nod disekat, semua permintaan yang diedarkan akan disekat, dan sumber benang sebelah pelayan akan diduduki, menyebabkan keseluruhan permintaan kluster disekat, malah kluster akan diturunkan.
Dari dua perspektif ini, masuk akal bahawa semua pangkalan data tidak menyukai pertukaran!
Mekanisme kerja swap
Memandangkan pangkalan data tidak berminat dengan swap, adakah perlu menggunakan perintah swapoff untuk matikan cache cakera Bagaimana dengan ciri? Tidak, anda boleh memikirkannya, apakah maksud mematikan cache cakera? Tiada sistem dalam persekitaran pengeluaran sebenar akan menjadi begitu radikal Anda mesti tahu bahawa dunia tidak pernah sama ada 0 atau 1. Semua orang lebih kurang akan memilih untuk berjalan di tengah, tetapi ada yang berat sebelah ke arah 0 dan ada yang berat sebelah. Jelas sekali, apabila ia berkaitan dengan pertukaran, pangkalan data mesti memilih untuk menggunakannya sesedikit mungkin. Beberapa keperluan dalam dokumen rasmi HBase sebenarnya untuk melaksanakan dasar ini: mengurangkan kesan pertukaran sebanyak mungkin. Hanya dengan mengenali diri anda dan musuh anda anda boleh memenangi setiap pertempuran Untuk mengurangkan kesan pertukaran, anda mesti memahami cara kitar semula memori Linux berfungsi, supaya tidak terlepas sebarang kemungkinan keraguan.
Mari kita lihat dahulu bagaimana pertukaran dicetuskan?
Ringkasnya, Linux akan mencetuskan kitar semula memori dalam dua senario Satu ialah ia akan mencetuskan kitar semula memori serta-merta apabila ia mendapati bahawa tiada memori percuma yang mencukupi semasa peruntukan memori; daemon dihidupkan Proses (proses swapd) memeriksa memori sistem secara berkala dan secara aktif mencetuskan kitar semula memori selepas memori yang tersedia jatuh ke ambang tertentu. Tiada apa yang boleh diperkatakan tentang senario pertama Mari fokus pada senario kedua, seperti yang ditunjukkan dalam gambar di bawah:
Inilah perkara pertama yang kami bayar. perhatian kepada Parameter: vm.min_free_kbytes, mewakili tera air minimum[min] memori percuma yang disimpan oleh sistem, dan mempengaruhi tera air[rendah] dan tera air[tinggi]. Ia boleh dianggap sebagai:
watermark[min] = min_free_kbytes watermark[low] = watermark[min] * 5 / 4 = min_free_kbytes * 5 / 4 watermark[high] = watermark[min] * 3 / 2 = min_free_kbytes * 3 / 2 watermark[high] - watermark[low] = watermark[low] - watermark[min] = min_free_kbytes / 4
Dapat dilihat bahawa paras air LInux ini tidak dapat dipisahkan daripada parameter min_free_kbytes. Kepentingan min_free_kbytes kepada sistem adalah jelas. Ia tidak boleh terlalu besar atau terlalu kecil.
Jika min_free_kbytes terlalu kecil, penimbal aras air antara [min, rendah] akan menjadi sangat kecil Semasa proses kitar semula kswapd, apabila lapisan atas digunakan untuk memori terlalu cepat (aplikasi biasa: pangkalan data), ia akan menyebabkan. memori bebas menjadi sangat kecil. Ia adalah mudah untuk jatuh di bawah tera air [min]. halaman untuk memenuhi permintaan memori, jadi ia sebenarnya akan menyekat aplikasi, membawa kelewatan respons tertentu. Sudah tentu, min_free_kbytes tidak sepatutnya terlalu besar, jika terlalu besar, ia akan mengurangkan memori proses aplikasi dan sumber memori sistem Sebaliknya, ia juga akan menyebabkan proses kswapd berbelanja banyak masa untuk kitar semula ingatan. Lihat proses ini sekali lagi. Adakah ia serupa dengan mekanisme pencetus kitar semula generasi lama dalam algoritma CMS dalam mekanisme pengumpulan sampah Java. Fikirkan tentang parameter -XX:CMSInitiatingOccupancyFraction, bukan? Dokumen rasmi memerlukan min_free_kbytes tidak boleh kurang daripada 1G (ditetapkan kepada 8G dalam sistem memori besar), iaitu, jangan mencetuskan kitar semula langsung dengan mudah.
Setakat ini, mekanisme pencetus kitar semula memori Linux dan parameter pertama vm.min_free_kbytes yang kami bimbangkan dijelaskan pada dasarnya. Seterusnya, mari kita lihat secara ringkas apa yang dikitar semula dalam kitar semula memori Linux. Objek kitar semula memori Linux terutamanya terbahagi kepada dua jenis:
1 Cache fail, ini mudah difahami Untuk mengelakkan data fail perlu dibaca dari cakera keras setiap kali, sistem akan menyimpan hotspot data dalam ingatan untuk meningkatkan prestasi. Jika anda hanya membaca fail, kitar semula memori hanya perlu melepaskan bahagian memori ini pada kali seterusnya anda membaca data fail, anda boleh membacanya terus dari cakera keras (serupa dengan cache fail HBase). Jika fail bukan sahaja dibaca, tetapi juga data fail cache diubah suai (data kotor), untuk mengitar semula memori, bahagian fail data ini perlu ditulis ke cakera keras dan kemudian dikeluarkan (serupa dengan fail MySQL cache).
2. Memori tanpa nama, bahagian memori ini tidak mempunyai pembawa sebenar, tidak seperti cache fail yang mempunyai pembawa seperti fail cakera keras, seperti data timbunan dan tindanan biasa. Bahagian memori ini tidak boleh dilepaskan terus atau ditulis kembali ke medium seperti fail semasa kitar semula Inilah sebabnya mekanisme swap dibangunkan untuk menukar memori jenis ini ke cakera keras dan memuatkannya semula apabila diperlukan.
Algoritma khusus yang digunakan oleh Linux untuk menentukan cache fail atau memori tanpa nama yang perlu dikitar semula tidak menjadi perhatian di sini Jika anda berminat, anda boleh merujuk di sini. Tetapi ada persoalan yang memerlukan kita berfikir: Memandangkan terdapat dua jenis memori yang boleh dikitar semula, bagaimanakah Linux menentukan jenis memori yang hendak dikitar semula apabila kedua-dua jenis memori boleh dikitar semula? Atau adakah kedua-duanya akan dikitar semula? Ini membawa kita kepada parameter kedua yang kita ambil berat: swappiness Nilai ini digunakan untuk menentukan seberapa aktif kernel menggunakan swap Semakin tinggi nilai, kernel akan menggunakan swap secara aktif. Positif. Nilai berkisar antara 0 hingga 100, dan lalai ialah 60. Bagaimanakah swappiness ini dicapai? Prinsip khusus adalah sangat rumit, ringkasnya, swappiness mencapai kesan ini dengan mengawal sama ada lebih banyak halaman tanpa nama dikitar semula atau lebih banyak cache fail dikitar semula semasa kitar semula memori. swappiness adalah sama dengan 100, yang bermaksud bahawa memori tanpa nama dan cache fail akan dikitar semula dengan keutamaan yang sama 60 bermakna bahawa cache fail akan dikitar semula terlebih dahulu fikirkanlah (keadaan biasa cache fail kitar semula Ia tidak akan menyebabkan operasi IO dan mempunyai sedikit kesan ke atas prestasi sistem). Untuk pangkalan data, swap harus dielakkan sebanyak mungkin, jadi ia perlu ditetapkan kepada 0. Perlu diingatkan di sini bahawa menetapkannya kepada 0 tidak bermakna swap tidak dilaksanakan!
Setakat ini, kami telah membincangkan tentang mekanisme pencetus kitar semula memori Linux, objek kitar semula memori Linux dan pertukaran, serta menerangkan parameter min_free_kbytes dan swappiness. Seterusnya, mari kita lihat parameter lain yang berkaitan dengan swap: zone_reclaim_mode. Dokumen mengatakan bahawa menetapkan parameter ini kepada 0 boleh mematikan tuntutan semula zon NUMA. Apabila ia datang kepada NUMA, pangkalan data tidak gembira lagi. Banyak DBA telah ditipu. Jadi berikut adalah tiga soalan kecil: Apakah NUMA? Apakah hubungan antara NUMA dan swap? Apakah maksud khusus zon_reclaim_mode?
NUMA (Akses Memori Bukan Seragam) adalah relatif kepada UMA Kedua-duanya adalah seni bina reka bentuk CPU awal telah direka bentuk dengan struktur UMA, seperti yang ditunjukkan dalam rajah di bawah (gambar dari Internet):
.Untuk mengurangkan masalah kesesakan saluran yang dihadapi oleh CPU berbilang teras membaca memori yang sama, jurutera cip mereka bentuk struktur NUMA, seperti yang ditunjukkan dalam rajah berikut (gambar dari Internet):
Seni bina ini boleh menyelesaikan masalah UMA, iaitu, CPU yang berbeza mempunyai kawasan memori eksklusif untuk mencapai "pengasingan memori". antara CPU, ia juga perlu Dua titik sokongan pada peringkat perisian:
1. 内存分配需要在请求线程当前所处CPU的专属内存区域进行分配。如果分配到其他CPU专属内存区,势必隔离性会受到一定影响,并且跨越总线的内存访问性能必然会有一定程度降低。
2. 另外,一旦local内存(专属内存)不够用,优先淘汰local内存中的内存页,而不是去查看远程内存区是否会有空闲内存借用。
这样实现,隔离性确实好了,但问题也来了:NUMA这种特性可能会导致CPU内存使用不均衡,部分CPU专属内存不够使用,频繁需要回收,进而可能发生大量swap,系统响应延迟会严重抖动。而与此同时其他部分CPU专属内存可能都很空闲。这就会产生一种怪现象:使用free命令查看当前系统还有部分空闲物理内存,系统却不断发生swap,导致某些应用性能急剧下降。见叶金荣老师的MySQL案例分析:《找到MySQL服务器发生SWAP罪魁祸首》。
所以,对于小内存应用来讲,NUMA所带来的这种问题并不突出,相反,local内存所带来的性能提升相当可观。但是对于数据库这类内存大户来说,NUMA默认策略所带来的稳定性隐患是不可接受的。因此数据库们都强烈要求对NUMA的默认策略进行改进,有两个方面可以进行改进:
1. 将内存分配策略由默认的亲和模式改为interleave模式,即会将内存page打散分配到不同的CPU zone中。通过这种方式解决内存可能分布不均的问题,一定程度上缓解上述案例中的诡异问题。对于MongoDB来说,在启动的时候就会提示使用interleave内存分配策略:
WARNING: You are running on a NUMA machine. We suggest launching mongod like this to avoid performance problems: numactl –interleave=all mongod [other options]
2. 改进内存回收策略:此处终于请出今天的第三个主角参数zone_reclaim_mode,这个参数定义了NUMA架构下不同的内存回收策略,可以取值0/1/3/4,其中0表示在local内存不够用的情况下可以去其他的内存区域分配内存;1表示在local内存不够用的情况下本地先回收再分配;3表示本地回收尽可能先回收文件缓存对象;4表示本地回收优先使用swap回收匿名内存。可见,HBase推荐配置zone_reclaim_mode=0一定程度上降低了swap发生的概率。
不都是swap的事
至此,我们探讨了三个与swap相关的系统参数,并且围绕Linux系统内存分配、swap以及NUMA等知识点对这三个参数进行了深入解读。除此之外,对于数据库系统来说,还有两个非常重要的参数需要特别关注:
1. IO调度策略:这个话题网上有很多解释,在此并不打算详述,只给出结果。通常对于sata盘的OLTP数据库来说,deadline算法调度策略是最优的选择。
2. THP(transparent huge pages)特性关闭。THP特性笔者曾经疑惑过很久,主要疑惑点有两点,其一是THP和HugePage是不是一回事,其二是HBase为什么要求关闭THP。经过前前后后多次查阅相关文档,终于找到一些蛛丝马迹。这里分四个小点来解释THP特性:
(1)什么是HugePage?
网上对HugePage的解释有很多,大家可以检索阅读。简单来说,计算机内存是通过表映射(内存索引表)的方式进行内存寻址,目前系统内存以4KB为一个页,作为内存寻址的最小单元。随着内存不断增大,内存索引表的大小将会不断增大。一台256G内存的机器,如果使用4KB小页, 仅索引表大小就要4G左右。要知道这个索引表是必须装在内存的,而且是在CPU内存,太大就会发生大量miss,内存寻址性能就会下降。
HugePage就是为了解决这个问题,HugePage使用2MB大小的大页代替传统小页来管理内存,这样内存索引表大小就可以控制的很小,进而全部装在CPU内存,防止出现miss。
(2)什么是THP(Transparent Huge Pages)?
HugePage是一种大页理论,那具体怎么使用HugePage特性呢?目前系统提供了两种使用方式,其一称为Static Huge Pages,另一种就是Transparent Huge Pages。前者根据名称就可以知道是一种静态管理策略,需要用户自己根据系统内存大小手动配置大页个数,这样在系统启动的时候就会生成对应个数的大页,后续将不再改变。而Transparent Huge Pages是一种动态管理策略,它会在运行期动态分配大页给应用,并对这些大页进行管理,对用户来说完全透明,不需要进行任何配置。另外,目前THP只针对匿名内存区域。
(3)HBase(数据库)为什么要求关闭THP特性?
THP ialah strategi pengurusan dinamik yang memperuntukkan dan mengurus halaman besar semasa masa jalan, jadi akan terdapat tahap kelewatan peruntukan tertentu, yang tidak boleh diterima untuk sistem pangkalan data yang mengejar kelewatan respons. Selain itu, THP mempunyai banyak kelemahan lain Anda boleh merujuk artikel ini "mengapa-tokudb-benci-transparent-hugepages"
(4) Berapa banyak kesan mematikan/menghidupkan THP pada HBase membaca dan menulis. prestasi?
Untuk mengesahkan sejauh mana impak menghidupkan dan mematikan THP terhadap prestasi HBase, saya melakukan ujian mudah dalam persekitaran ujian: kluster ujian hanya mempunyai satu RegionServer dan beban ujian ialah baca-tulis nisbah 1:1. THP mempunyai dua pilihan: sentiasa dan tidak pernah dalam sesetengah sistem, dan pilihan tambahan yang dipanggil madvise dalam sesetengah sistem. Anda boleh menggunakan perintah echo never/sentiasa > /sys/kernel/mm/transparent_hugepage/enabled untuk mematikan/menghidupkan THP. Keputusan ujian ditunjukkan dalam rajah di bawah:
Seperti yang ditunjukkan dalam rajah di atas, dalam senario penutupan TPH (tidak pernah) HBase mempunyai prestasi terbaik dan adalah agak stabil. Dalam adegan di mana THP dihidupkan (sentiasa), prestasi menurun sebanyak kira-kira 30% berbanding dengan adegan di mana THP dimatikan, dan lengkung sangat bergetar. Ia boleh dilihat bahawa ingat untuk mematikan THP dalam talian di HBase.
Cadangan berkaitan: "Tutorial Video Linux"
Atas ialah kandungan terperinci apa itu linux swap. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!