调整linux内核尽可能用内存,而不用swap

线上一台服务器kswapd0占用大量的cpu资源,致使负载太高,什么是kswapd0?linux

wKiom1RcMdSzo3dAAAOi6WNuPUA882.jpg

Linux uses kswapd for virtual memory management such that pages that havebeen recently accessed are kept in memory and less active pages are paged outto disk.数据库

(what is a page?)…Linux uses manages memory in units called pages.缓存

So,the kswapd process regularly decreases the ages of unreferencedpages…and at the end they are paged out(moved out) to disk服务器

kswapd0进程的做用:它是虚拟内存管理中,负责换页的,操做系统每过必定时间就会唤醒kswapd ,看看内存是否紧张,若是不紧张,则睡眠,在 kswapd 中,有2 个阀值,pages_hige pages_low,当空闲内存页的数量低于 pages_low 的时候,kswapd进程就会扫描内存而且每次释放出32 free pages,直到 free page 的数量到达pages_highoracle

分析结果是:app

physical mem 不足,引发 swap 频繁读写。less

kswapd0 是系统的虚拟内存管理程序,若是物理内存不够用,系统就会唤醒 kswapd0 进程,由 kswapd0 分配磁盘交换空间做缓存,于是占用大量的 CPU 资源。tcp



查看内存及swap使用率:发现还有空余的内存,可是已经开始用swap了。编辑器

wKioL1RcJ2yhkZ7QAACHMu7teHo211.jpg


内存使用到多少开始使用swap?ide

vm.swappiness   这个内核参数控制
/proc/sys/vm/swappiness


这个交换参数控制内核从物理内存移出进程,移到交换空间。该参数从0到100,当该参数=0,表示只要有可能就尽力避免交换进程移出物理内存;该参数=100,这告诉内核疯狂的将数据移出物理内存移到swap缓存中。

The defaultvalue I’ve seen on both enterprise level Red Hat and SLES servers is 60.
To find out what the default value is on aparticular server, run:
sysctl vm.swappiness
The value is also located in/proc/sys/vm/swappiness.

 

PS:设置vm.swappiness=0 后并不表明禁用swap分区,只是告诉内核,能少用到swap分区就尽可能少用到,设置vm.swappiness=100的话,则表示尽可能使用swap分区,默认的值是60

调整内存参数,当内存使用率不足10%(开始是默认值60)时在使用swap,尽可能避免使用swap,减小唤醒软中断进程,从而下降ksoftirqd进程对cpu的占用。

wKiom1RcJ0qihaBdAAAy0LKeCzE718.jpg


关于linux内存分配机制

linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来作缓存使用,对于开启过的程序、或是读取刚存取过得数据会比较快。

一.  咱们先来查看一个内存使用的例子:
[oracle@db1 ~]$ free -m
               total       used      free     shared    buffers    cached
Mem:       72433     67075     5357      0       558       62221
-/+ buffers/cache:    4295      68138
Swap:       72096      91      72004
上述结果显示了67075Mused,可是(-/+ buffers/cache)减去bufferscache的结果能够看到,因此当前进程实际占用内存是4296M
能够这么理解:在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来作缓存使用,对于开启过的程序、或是读取刚存取过得数据会比较快。
如上面的例子:使用了72433M的内存,67075M被占用,可是buuffercached部分做为缓存,可使用命中率的方式提升使用效率,并且这部分缓存是根据指令随时能够释放的,咱们能够认为这部份内存没有实际被使用,也能够认为它是空闲的。
所以查看目前进程正在实际被使用的内存,是used-(buffers+cache),也能够认为若是swap没有大量使用,mem仍是够用的,只有mem被当前进程实际占用完(没有了bufferscache),才会使用到swap的。

二. Swap配置对性能的影响
分配太多的Swap空间会浪费磁盘空间,而Swap空间太少,则系统会发生错误。若是系统的物理内存用光了,系统就会跑得很慢,但仍能运行;若是Swap空间用光了,那么系统就会发生错误。例如,Web服务器能根据不一样的请求数量衍生出多个服务进程(或线程),若是Swap空间用完,则服务进程没法启动,一般会出现“application is out of memory”的错误,严重时会形成服务进程的死锁。所以Swap空间的分配是很重要的。
一般状况下,Swap空间应大于或等于物理内存的大小,最小不该小于64M,一般Swap空间的大小应是物理内存的2-2.5倍。但根据不一样的应用,应有不一样的配置:若是是小的桌面系统,则只须要较小的Swap空间,而大的服务器系统则视状况不一样须要不一样大小的Swap空间。特别是数据库服务器和Web服务器,随着访问量的增长,对Swap空间的要求也会增长,通常来讲对于4G 如下的物理内存,配置2倍的swap4G 以上配置1倍。
另外,Swap分区的数量对性能也有很大的影响。由于Swap交换的操做是磁盘IO的操做,若是有多个Swap交换区,Swap空间的分配会以轮流的方式操做于全部的Swap,这样会大大均衡IO的负载,加快Swap交换的速度。若是只有一个交换区,全部的交换操做会使交换区变得很忙,使系统大多数时间处于等待状态,效率很低。用性能监视工具就会发现,此时的CPU并不很忙,而系统却慢。这说明,瓶颈在IO上,依靠提升CPU的速度是解决不了问题的。

.  Linux 内存机制
Linux
支持虚拟内存(VirtualMmemory),虚拟内存是指使用磁盘看成RAM的扩展,这样可用的内存的大小就相应地增大了。内核会将暂时不用的内存块的内容写到硬盘上,这样一来,这块内存就可用于其它目的。当须要用到原始的内容时,它们被从新读入内存。这些操做对用户来讲是彻底透明的;Linux下运行的程序只是看到有大量的内存可供使用而并无注意到时不时它们的一部分是驻留在硬盘上的。固然,读写硬盘要比直接使用真实内存慢得多(要慢数千倍),因此程序就不会象一直在内存中运行的那样快。用做虚拟内存的硬盘部分被称为交换空间(Swap Space)
通常,在交换空间中的页面首先被换入内存;若是此时没有足够的物理内存来容纳它们又将被交换出来(到其余的交换空间中)。若是没有足够的虚拟内存来容纳全部这些页面,Linux就会波动而不正常;但通过一段较长的时间Linux会恢复,但此时系统已不可用了。
有时,尽管有许多的空闲内存,仍然会有许多的交换空间正被使用。这种状况是有可能发生的,例如若是在某一时刻有进行交换的必要,但后来一个占用不少物理内存的大进程结束并释放内存时。被交换出的数据并不会自动地交换进内存,除非有这个须要时。此时物理内存会在一段时间内保持空闲状态。对此并无什么可担忧的,可是知道了是怎么一回事,也就无所谓了。
许多操做系统使用了虚拟内存的方法。由于它们仅在运行时才须要交换空间,以解决不会在同一时间使用交换空间,所以,除了当前正在运行的操做系统的交换空间,其它的就是一种浪费。因此让它们共享一个交换空间将会更有效率。
注意:若是会有几我的同时使用这个系统,他们都将消耗内存。然而,若是两我的同时运行一个程序,内存消耗的总量并非翻倍,由于代码页以及共享的库只存在一份。

Linux
系统经常动不动就使用交换空间,以保持尽量多的空闲物理内存。即便并无什么事情须要内存,Linux也会交换出暂时不用的内存页面。这能够避免等待交换所需的时间:当磁盘闲着,就能够提早作好交换。能够将交换空间分散在几个硬盘之上。针对相关磁盘的速度以及对磁盘的访问模式,这样作能够提升性能。

与访问物理内存相比,磁盘的读写是很慢的。另外,在相应较短的时间内屡次读磁盘一样的部分也是常有的事。例如,某人也许首先阅读了一段E-mail消息,而后为了答复又将这段消息读入编辑器中,而后又在将这个消息拷贝到文件夹中时,使得邮件程序又一次读入它。或者考虑一下在一个有着许多用户的系统中 ls命令会被使用多少次。经过将信息从磁盘上仅读入一次并将其存于内存中,除了第一次读之外,能够加快全部其它读的速度。这叫做磁盘缓冲(Disk Buffering),被用做此目的的内存称为高速缓冲(Buffer Cache)。可是,因为内存是一种有限而又不充足的资源,高速缓冲不可能作的很大(它不可能包容要用到的全部数据)。当缓冲充满了数据时,其中最长时间不用的数据将被舍弃以腾出内存空间用于新的数据。

对写磁盘操做来讲磁盘缓冲技术一样有效。一方面,被写入磁盘的数据经常会很快地又被读出(例如,原代码文件被保存到一个文件中,又被编译器读入),因此将要被写的数据放入缓冲中是个好主意。另外一方面,经过将数据放入缓冲中,而不是将其马上写入磁盘,程序能够加快运行的速度。之后,写的操做能够在后台完成,而不会拖延程序的执行。
大多数操做系统都有高速缓冲(尽管可能称呼不一样),可是并非都遵照上面的原理。有些是直接写(Write-Through):数据将被马上写入磁盘(固然,数据也被放入缓存中)。若是写操做是在之后作的,那么该缓存被称为后台写(Write-Back)。后台写比直接写更有效,但也容易出错:若是机器崩溃,或者忽然掉电,缓冲中改变过的数据就被丢失了。若是仍未被写入的数据含有重要的薄记信息,这甚至可能意味着文件系统(若是有的话)已不完整。
针对以上的缘由,出现了不少的日志文件系统,数据在缓冲区修改后,同时会被文件系统记录修改信息,这样即便此时系统掉电,系统重启后会首先从日志记录中恢复数据,保证数据不丢失。固然这些问题再也不本文的叙述范围。
因为上述缘由,在使用适当的关闭过程以前,绝对不要关掉电源,Sync命令倾空(Flushes)缓冲,也即,强迫全部未被写的数据写入磁盘,可用以肯定全部的写操做都已完成。在传统的UNIX系统中,有一个叫作update的程序运行于后台,每隔30秒作一次sync操做,所以一般无需手工使用sync命令了。Linux另外有一个后台程序,Bdflush,这个程序执行更频繁的但不是全面的同步操做,以免有时sync的大量磁盘I/O操做所带来的磁盘的忽然冻结。
Linux中,Bdflush是由update启动的。一般没有理由来担忧此事,但若是因为某些缘由bdflush进程死掉了,内核会对此做出警告,此时你就要手工地启动它了(/sbin/update)


缓存(Cache)实际并非缓冲文件的,而是缓冲块的,块是磁盘I/O操做的最小单元(Linux中,它们一般是1KB)。这样,目录、超级块、其它文件系统的薄记数据以及非文件系统的磁盘数据均可以被缓冲了。缓冲的效力主要是由它的大小决定的。缓冲过小的话等于没用。它只能容纳一点数据,所以在被重用时,全部缓冲的数据都将被倾空。实际的大小依赖于数据读写的频次、相同数据被访问的频率。只有用实验的方法才能知道。
若是缓存有固定的大小,那么缓存太大了也很差,由于这会使得空闲的内存过小而致使进行交换操做(这一样是慢的)。为了最有效地使用实际内存,Linux自动地使用全部空闲的内存做为高速缓冲,当程序须要更多的内存时,它也会自动地减少缓冲的大小。 
这就是通常状况下Linux内存的通常机制,真正的Linux内存的运行机制远远比这个复杂。

 

Other

swap tendency = mapped ratio / 2 + distress + swappiness

The mapped ratio value is the percentage of pages in all memory zones thatbelong to User Mode address spaces (sc->nr_mapped) with respect to the totalnumber of allocatable page frames. A high value of mapped_ratio means that thedynamic memory is mostly used by User Mode processes, while a low value meansthat it is mostly used by the page cache.

The distress value is a measure of how effectively the PFRA is reclaiming pageframes in this zone; it is based on the scanning priority of the zone in theprevious run of the PFRA, which is stored in the prev_priority field of thezone descriptor. The distress value depends on the zone's previous priority asfollows:

Zone prev. priority
12...7
6
5
4
3
2
1
0

Distress value
0
1
3
6
12
25
50
100
Finally, the swappiness value is a user-defined constant, which is usually setto 60. The system administrator may tune this value by writing in the/proc/sys/vm/swappiness file or by issuing the proper sysctl( ) system call.

Pages will be reclaimed from the address spaces of processes only if the zone'sswap tendency is greater than or equal to 100. Thus, if the systemadministrator sets swappiness to 0, then the PFRA never reclaims pages in theUser Mode address spaces unless the zone's previous priority is zero (anunlikely event); if the administrator sets swappiness to 100, then the PFRAreclaims pages in the User Mode address spaces at every invocation.
swappiness
,吃参数是获得swap tendency的一个量,而swap tendencylinux内核进行内存进行回收的一个阀值和标量。

 

首先是,kswapd进程来按期扫描系统资源,查看内存是否够用,由两个值影响pages_highpage_low,若是如今可以使用的区间在page_high<x<page_low,就开始检查从文件系统读入的文件,有无被修改的内存页面,若是有就写入到磁盘,可是,若是内存页面被修改了,有可能不是从文件系统读入的,即找不到回写的位置,malloc产生的anonymous内存数据就写入swap分区,这部分当进程在次被唤醒,得到了CPU运行时间,在从swap读入


补充:

在网上查询也有多是iptables的缘由,若是在iptables上添加了单IP链接数限制,以下:

iptables -vnL


Chain FORWARD (policy ACCEPT 761G packets, 477T bytes)
 pkts bytes target     prot opt in     out     source               destination         
  50M 5790M REJECT     tcp  --  *      *       10.x.0.0/16        0.0.0.0/0           #conn/32 > 500 reject-with icmp-port-unreachable 
  56M 4581M REJECT     tcp  --  *      *       10.x.0.0/16        0.0.0.0/0           #conn/32 > 500 reject-with icmp-port-unreachable 
2666K  208M REJECT     tcp  --  *      *       10.x.0.0/16        0.0.0.0/0           #conn/32 > 500 reject-with icmp-port-unreachable 
  18M  976M REJECT     tcp  --  *      *       10.x.0.0/16        0.0.0.0/0           #conn/32 > 500 reject-with icmp-port-unreachable 
14112  745K REJECT     tcp  --  *      *       10.x.0.0/16        0.0.0.0/0           #conn/32 > 500 reject-with icmp-port-unreachable 
    0     0 REJECT     tcp  --  *      *       10.x.0.0/16        0.0.0.0/0           #conn/32 > 500 reject-with icmp-port-unreachable

使用 ksoftirqd  -F FORWARD清空转发表便可。

相关文章
相关标签/搜索