linux 优化

CPU

进程绑定CPU tastset

调整进程优先级 nice renice

内存

swap

swappiness 使用swap的倾向性 0-100 内存足够大 可以调整10

系统默认 使用的页表占内存的%+swappiness%>=100 开始使用swap

cat /proc/sys/vm/swappiness

临时性修改 sysctl vm.swappiness=10

永久修改 Vim /etc/sysctl.conf 最后一行添加 vm.swappiness=10

msgmax

以字节为单位规定信息队列中任意信息的最大允许大小。这个值一定不能超过该队列的大小

(msgmnb)。默认值为 65536。

msgmnb

以字节为单位规定单一信息队列的最大值。默认为 65536 字节。

msgmni

规定信息队列识别符的最大数量(以及队列的最大数量)。64 位架构机器的默认值为 1985;32

位架构机器的默认值为 1736。

shmall

以字节为单位规定一次在该系统中可以使用的共享内存总量。64 位架构机器的默认值为

4 294 967296;32 位架构机器的默认值为 2684 354 56。

shmmax

以字节为单位规定内核可允许的最大共享内存片段。64 位架构机器的默认值为 687194 76736;

32 位架构机器的默认值为 4 294 967295。注:但内核支持的值比这个值要多得多。

shmmni

规定系统范围内最大共享内存片段。在 64 位和 32 位架构机器中的默认值都是 4 096。

dirty_ratio

规定百分比值。当脏数据组成达到系统内存总数的这个百分比值后开始写下脏数据(pdflush)。

默认值为 20。

dirty_background_ratio

规定百分比值。当脏数据组成达到系统内存总数的这个百分比值后开始在后端写下脏数据

(pdflush)。默认值为 10。

磁盘i/o

queue length

/sys/block/<dev>/queue/nr_requests

I/O 调度程序

调整i/o调度算法

cd /sys/block/sda/queue

echo cfq > scheduler

写到 /etc/init.d/rc.local

参数

/sys/block/device/queue/iosched/

完全公平调度(CFQ)

fifo_expire_async
这个可调参数控制异步(缓存写入)请求等待的时间长度。过期后(以毫秒计)会将无法满足的异
步请求移动到调度表中。默认为 250 毫秒。
fifo_expire_sync
这个参数与 fifo_expire_async 相同,用于同步请求(读取和 O_DIRECT 写入)。默认为 125 毫
秒。

最后期限 I/O 调度程序

read_expire
这个可调参数可让您已毫秒为单位设定读取操作速度。默认将其设定为 500 毫秒(即半秒)。
write_expire
这个可调参数可让您已毫秒为单位设定写入操作速度。默认将其设定为 5000 毫秒(即五秒)。
writes_starved
这个可调参数控制处理单一写入批之前可以处理多少读取批。这个值越高,越倾向于读取操作。

Noop
Noop I/O 调度程序采用先入先出(FIFO)调度算法。合并原始块层中的请求,但只是一个最后命中缓存
(last-hit cache)。如果系统与 CPU 捆绑,且使用高速存储,这就是可以使用的最佳 I/O 调度程序。

文件系统

磁盘的碎片状况 dumpe2fs

mount �Co noatime

ext3 支持三种日志模式,划分的依据是选择元数据块还是数据块写入日志,以及何时写入日志。

1. 日志模式(Journal):文件系统所有数据和元数据的改变都被记入日志。这种模式减少了丢失每个文件的机会,但需要很多额外的磁盘访问。例如:当一个新文件被创建时,它的所有数据块都必须复制一份作为日志记录。这是最安全但最慢的日志模式。

2. 预定模式(Ordered):只对文件系统元数据块的改变才记入日志,这样可以确保文件系统的一致性,但是不能保证文件内容的一致性。然而,ext3文件系统把元数据块和相关的数据块进行分组,以便在元数据块写入日志之前写入数据块。这样,就可以减少文件内数据损坏的机会;例如,确保增大文件的任何写访问都完全受日志的保护。这是缺省的 ext3 日志模式。

3. 写回(Writeback):只有对文件系统元数据的改变才被记入日志对文件数据的更新与元数据记录可以不同步(相对Ordered模式而言),即ext3是支持异步的日志。

-o data= journal ordered writeback

文件系统块大小

ext4

Barriers
写入 barrier 是保证在永久存储中正确写入并排列文件系统元数据的内核机制,即使在存储设备会经常断电
的情况也不例外。启用了写入 barrier 的文件系统还可以保证在断电时保存使用 fsync() 进行的所有数据传
输。红帽企业版 Linux 默认在所有支持此功能的硬件上启用 barrier。
但启用写入 barrier 可显著延缓一些程序的速度,特别是使用很多 fsync() 的程序,或者延缓创建和删除大
量小文件的速度。对于没有不稳定写入缓存的存储,或者罕见的文件系统不一致的情况以及断电后出现可以
承受的数据丢失,可使用 nobarrier 挂载选项禁用 barrier

访问时间(noatime)

增加的预读支持

blockdev 命令查看并编辑预读值

# blockdev -getra device
要修改那个块设备的预读值,请运行以下命令。N 代表 512 字节扇区中的数值。
# blockdev -setra N device
注:使用 blockdev 命令选择的值重启后不会保留。我们建议创建一个运行等级 init.d 脚本在引导时设
定这个值。

mysql 数据文件在XFS文件系统上性能优于EXT4

测试工具

ioZeno

aio-stress

blktrace blkparse seekwatcher

网络系统

接收队列 发送队列 都是一段内存空间

核心缓冲

TCP缓冲

一段内存空间 在linux 一个socket文件

netstat �Ctunlp

sar �Cn SOCK

totsck
Total number of sockets used by the system.

tcpsck
Number of TCP sockets currently in use.

udpsck
Number of UDP sockets currently in use.

rawsck
Number of RAW sockets currently in use.

ip-frag
Number of IP fragments currently in use.

tcp-tw
Number of TCP sockets in TIME_WAIT state.

lsof

netstat �Can | awk ‘/^tcp/{s[$NF}++}END { for (i in s) print i,s[i]}’

dstat

网络优化参数:

net.ipv4.tcp_max_tw_buckets
timewait的数量,默认为8192;

net.ipv4.ip_local_port_range = 1024 65000
允许系统打开的端口范围,前而为下限,后面的数字为上限;默认为“32768 61000”;
注意:此可用范围决定了最后timewait状态的连接的数量;下面的两项可有效降低tw状态连接的数量;

net.ipv4.tcp_tw_recycle = {0|1}
是否启用timewait快速回收;注意:开启此功能在NAT环境下可能会出现严重的问题:因为TCP有一种行为,它可以缓存每个连接最新的时间戳,后续请求中如果时间戳小于缓存中的时间戳,即被视为无效并丢弃相应的请求报文;Linux是否启用这种行为取决于tcp_timestamp和tcp_tw_recycle,而前一个参数默认是启用的,所以启用后面的参数就会激活此功能;
因此,如果是NAT环境,安全起见,应该禁用tcp_tw_recycle。另一种解决方案:把tcp_timestamps设置为0,tcp_tw_recycle设置为1并不会如想象中奏效,因为一旦关闭了tcp_timestamps,那么即便打开了tcp_tw_recycle,后面的参数也没有效果。此时降低net.ipv4.tcp_max_tw_buckets的值就可以显著降低tw连接的数量了。


net.ipv4.tcp_tw_reuse = {0|1}
是否开启tw重用,即是否允许将TIME-WAIT sockets 用于新的TCP连接;

net.ipv4.tcp_syncookies = {0|1}
是否开启SYN Cookies,即当SYN等待队列溢出时,是否启用cookies功能;

net.ipv4.tcp_timestamps = 0
tcp报文时间戳,关闭时可以避免序列号的卷绕,如上所述;


net.ipv4.tcp_max_syn_backlog = 262144
保存的那些尚未收到客户端确认信息的连接请求的最大值;默认为128,可增大此值;


net.ipv4.tcp_synack_retries = #
为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK,这也即所谓的三次握手中的第二次;这个设置决定了内核放弃连接之前发送SYN+ACK 包的数量;繁忙的服务器上建议设置为0或者1;

net.ipv4.tcp_syn_retries = #
在内核放弃建立连接之前发送SYN包的数量;繁忙的服务器上建议设置为0或者1;

net.ipv4.tcp_max_orphans = 262144
系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上;如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息;
这个限制仅仅是为了防止简单的DoS 攻击,不能过分依靠它或者人为地减小这个值,如果需要修改,在确保有足够内存可用的前提下,应该增大此值;


net.ipv4.tcp_fin_timeout = 5
如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间;缺省值是60秒。
然而,对端可能会出错或意外宕机并永远不关闭连接。即使你的机器是一个轻载的WEB 服务器,也有因为大量的死套接字而内存溢出的风险,FIN-WAIT-2 的危险性比FIN-WAIT-1要小,因为每个连接最多只能消耗1.5K内存,但是它们的生存期长些;

net.ipv4.tcp_keepalive_time = 30
当keepalive起用的时候,TCP发送keepalive消息的频度,默认是是2小时;

net.core.rmem_max=8388608
定义内核用于所有类型的连接的最大接收缓冲大小;

net.core.rmem_default=65536
定义内核用于所有类型的连接的默认接收缓冲大小;

net.core.wmem_max=8388608
定义内核用于所有类型的连接的最大发送缓冲大小;

net.core.wmem_default=65536
定义内核用于所有类型的连接的默认发送缓冲大小;

net.ipv4.tcp_mem='8388608 8388608 8388608'
定义TCP协议栈使用的内存空间;分别为最小值,默认值和最大值;

net.ipv4.tcp_rmem='4096 87380 8388608'
定义TCP协议栈用于接收缓冲的内存空间;第一个值为最小值,即便当前主机内存空间吃紧,也得保证tcp协议栈至少有此大小的空间可用;第二个值为默认值,它会覆盖net.core.rmem_default中为所有协议定义的接收缓冲的大小;第三值为最大值,即能用于tcp接收缓冲的最大内存空间;

net.ipv4.tcp_wmem='4096 65536 8388608'
定义TCP协议栈用于发送缓冲的内存空间;

国内著名电商某服务器的内核优化参数:

# Controls the default maxmimum size of a mesage queue
kernel.msgmnb = 65536

# Controls the maximum size of a message, in bytes
kernel.msgmax = 65536

# Controls the maximum shared segment size, in bytes
kernel.shmmax = 68719476736

# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296
net.core.somaxconn = 32768
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 0
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_time = 100
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 200

你可能感兴趣的:(linux,优先级)