Home > 随笔 > Linux 线上系统调优备忘

Linux 线上系统调优备忘

大公司呆久了,都会对 SA的依赖十分强烈,很多事情 SA都帮我们搞定了。如今控制成本,没有招聘 SA,又没有购买 VPS,从买物理机开始到 IDC部署,服务器调优,虚拟机管理,全部都是自己来,才发现,安装一台 Linux机器自己玩很简单,但是要达到线上服务器的标准,还有若干调优工作需要做,有 SA的日志是多幸福的事情啊。

物理机设备驱动

Dell服务器默认安装系统后会报找不到驱动:

W: Possible missing firmware /lib/firmware/tigon/tg3_tso5.bin

因为 Debian/Ubuntu 的包都是开源的,默认开源驱动性能不行,于是需要添加 non-free源:

deb http://ftp.de.debian.org/debian main contrib non-free
deb-src http://ftp.de.debian.org/debian main contrib non-free

然后:

apt-get update
apt-get install firmware-linux-free firmware-linux-nonfree

解决 Dell驱动报错问题。

配置限制

查看 /etc/security/limits.conf 没有就新建,加入 core 和 nofile 的相关配置,比如:

* soft nofile 65536
* hard nofile 65536
* soft core unlimited
* hard core unlimited
# End of file

之类的,不用到 ~/.bashrc 里面调用 ulimit。

网卡多队列

打开内核网卡多队列支持,避免网卡中断都集中在 cpu0 上处理,多队列打开后,可以让网卡中断均摊到各个 cpu上,对提高并发十分有用:

wget http://skywind3000.github.io/install/set_irq_affinity.sh

放到 /etc/config 目录下面(没有就新建),然后在 /etc/rc.local 里面加一行,每次重启就跑 set_irq_affinity.sh 且必须用 bash跑,参数传入需要开启多队列的网卡,以下是 /etc/rc.local 的内容:

/bin/bash 
/etc/set_irq_affinity.sh eth0 eth1 eth2

exit 0

下面是 setirqaffinity.sh 的代码:

# setting up irq affinity according to /proc/interrupts
# 2008-11-25 Robert Olsson
# 2009-02-19 updated by Jesse Brandeburg
#
# > Dave Miller:
# (To get consistent naming in /proc/interrups)
# I would suggest that people use something like:
#   char buf[IFNAMSIZ+6];
#
#   sprintf(buf, "%s-%s-%d",
#           netdev->name,
#       (RX_INTERRUPT ? "rx" : "tx"),
#       queue->index);
#
#  Assuming a device with two RX and TX queues.
#  This script will assign: 
#
#   eth0-rx-0  CPU0
#   eth0-rx-1  CPU1
#   eth0-tx-0  CPU0
#   eth0-tx-1  CPU1
#

set_affinity()
{
    MASK=$((1<<$VEC))
    printf "%s mask=%X for /proc/irq/%d/smp_affinity\n" $DEV $MASK $IRQ
    printf "%X" $MASK > /proc/irq/$IRQ/smp_affinity
    #echo $DEV mask=$MASK for /proc/irq/$IRQ/smp_affinity
    #echo $MASK > /proc/irq/$IRQ/smp_affinity
}

if [ "$1" = "" ] ; then
    echo "Description:"
    echo "    This script attempts to bind each queue of a multi-queue NIC"
    echo "    to the same numbered core, ie tx0|rx0 --> cpu0, tx1|rx1 --> cpu1"
    echo "usage:"
    echo "    $0 eth0 [eth1 eth2 eth3]"
fi


# check for irqbalance running
IRQBALANCE_ON=`ps ax | grep -v grep | grep -q irqbalance; echo $?`
if [ "$IRQBALANCE_ON" == "0" ] ; then
    echo " WARNING: irqbalance is running and will"
    echo "          likely override this script's affinitization."
    echo "          Please stop the irqbalance service and/or execute"
    echo "          'killall irqbalance'"
fi

#
# Set up the desired devices.
#

for DEV in $*
do
  for DIR in rx tx TxRx
  do
     MAX=`grep $DEV-$DIR /proc/interrupts | wc -l`
     if [ "$MAX" == "0" ] ; then
       MAX=`egrep -i "$DEV:.*$DIR" /proc/interrupts | wc -l`
     fi
     if [ "$MAX" == "0" ] ; then
       echo no $DIR vectors found on $DEV
       continue
       #exit 1
     fi
     for VEC in `seq 0 1 $MAX`
     do
        IRQ=`cat /proc/interrupts | grep -i $DEV-$DIR-$VEC"$"  | cut  -d:  -f1 | sed "s/ //g"`
        if [ -n  "$IRQ" ]; then
          set_affinity
        else
           IRQ=`cat /proc/interrupts | egrep -i $DEV:v$VEC-$DIR"$"  | cut  -d:  -f1 | sed "s/ //g"`
           if [ -n  "$IRQ" ]; then
             set_affinity
           fi
        fi
     done
  done
done


# done

重启以后,cat 一下 /proc/interrupts里面,最右边网卡相关的中断是不是分摊到不同的cpu上面了。

网络参数优化

参考下面 /etc/sysctl.conf里面的优化选项和你 /etc/sysctl.conf 的具体内容,视情况更改:

#
# /etc/sysctl.conf - Configuration file for setting system variables
fs.file-max = 100000

#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0, 
#是为了防止一定程度上的DOD的
net.ipv4.tcp_syncookies = 1

#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭; 不是很建议设置,可能接受错误的数据
#net.ipv4.tcp_tw_reuse = 1

#表示尽量不启用交换分区。
vm.swappiness=0

#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。 
net.ipv4.tcp_tw_recycle = 1

#表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为5000。
net.ipv4.tcp_max_tw_buckets = 10000

# 允许更多的PIDs (减少滚动翻转问题); may break some programs 32768
kernel.pid_max = 65535

#表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。 
net.ipv4.ip_local_port_range = 1024 65000

#记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024。 
net.ipv4.tcp_max_syn_backlog = 16384

#时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。
net.ipv4.tcp_timestamps = 0

#为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。
net.ipv4.tcp_synack_retries = 2

#在内核放弃建立连接之前发送SYN包的数量。
net.ipv4.tcp_syn_retries = 2

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

#当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时
net.ipv4.tcp_keepalive_time = 1200

#ip_conntrack如果超过限制会出现丢包错误,默认为65535
#net.ipv4.ip_conntrack_max = 655360

#ip_conntrack回收速度
#net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180

#每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
net.core.netdev_max_backlog =  262144

#web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而Nginx内核参数定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。
net.core.somaxconn = 262144

net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

net.ipv4.tcp_mem = 94500000 915000000 927000000

#系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS攻击
net.ipv4.tcp_max_orphans = 3276800

# 避免放大攻击
#net.ipv4.icmp_echo_ignore_broadcasts = 1

# 开启恶意icmp错误消息保护
#net.ipv4.icmp_ignore_bogus_error_responses = 1

# 开启并记录欺骗,源路由和重定向包
#net.ipv4.conf.all.log_martians = 1
#net.ipv4.conf.default.log_martians = 1

# 处理无源路由的包
#net.ipv4.conf.all.accept_source_route = 0
#net.ipv4.conf.default.accept_source_route = 0
# 开启反向路径过滤
#net.ipv4.conf.all.rp_filter = 1

#net.ipv4.conf.default.rp_filter = 1

# 确保无人能修改路由表
#net.ipv4.conf.all.accept_redirects = 0
#net.ipv4.conf.default.accept_redirects = 0
#net.ipv4.conf.all.secure_redirects = 0
#net.ipv4.conf.default.secure_redirects = 0

# 不充当路由器
#net.ipv4.ip_forward = 0
#net.ipv4.conf.all.send_redirects = 0
#net.ipv4.conf.default.send_redirects = 0

# Turn off the tcp_window_scaling 
# #net.ipv4.tcp_window_scaling = 0 
# # Turn off the tcp_sack 
# #net.ipv4.tcp_sack = 0 


#

参考上面的经验配置,按需要取消注释。

修改时钟源

查看当前时钟源和修改时钟源:

# cat /sys/devices/system/clocksource/clocksource0/available_clocksource
# cat /sys/devices/system/clocksource/clocksource0/current_clocksource
# echo hpet > /sys/devices/system/clocksource/clocksource0/current_clocksource

之前发现有一台服务器同样进程耗费的 cpu比其他服务器高很多,经过查证开发同学在那个进程里频繁取系统时间,同时那台机器 gettimeofday之类的系统调用耗时比其他服务器要久。因为改代码已经来不及了,还好发现原来几台服务器的时钟源不同,经过修改后,取时间的系统调用时间大大下降。

强制扫描磁盘

机房突然停电,UPS没弄好,机器发生重启,一般会自动扫描硬盘,但是如果不放心要扫描主硬盘的话,可以手动来:

touch /forcefsck

在根目录下面创建一个名为 forcefsdk 的文件即可,然后重新启动就会进入强制 fsck程序。

Categories: 随笔 Tags:
  1. richard
    December 14th, 2016 at 14:33 | #1

    嘿嘿,每套新硬件或云都有地方要优化丫,招个SA 嘛

  2. July 8th, 2020 at 23:53 | #2

    台灣最新詐術~由台灣人{腦科醫生}自行研發科技~全台百位{民俗老師}分散全台各地,並且互不認識~皆被集團吸收利用,全台百萬上當~上門求助客人~聽命機房總機{祖師爺神通傳話}發號施令~利用心理學{心理控制術}用客人來辦客人的手法循環利用~掌握龐大社會人力資源供{問事集團}辦事利用~{機器搭配人類心理學原理}~{補財庫}{家庭子女}{事業}{斬桃花}均可用百萬人力資源幫你解決~可用,祖師爺{神通傳話科技}~利用上門,全台受騙百萬客人,可影響選局成敗~集團背後操控

    台灣有一{問事集團}~大概15年前發展出二套科技~架設基地台,測人體腦電波~阿法波~貝塔波~係塔波~真的可以測出人類,腦中的想法~影像和{人體喜怒哀樂感官}~用途用於{問事}~{乩童}~{算命}~{通靈感應}~{白龍王}十分神準~百發百中~{搭配集團自創音波傳話技術,{稱做是神通傳話技術}只有(受話者)聽得到機房(傳話指令)手機收的到訊號的地方都可對你進行傳話~十分利害的技術~可對人進行監控

    兩項技術,搭配在一起,簡直天衣無縫~無人會察覺此詐術,由機房發話給神壇老師~轉述客人當下腦袋中的想法~客人一聽想說遇到神仙老師了~怎麼算的那麼準~我都還沒開口就知道我想問什麼~從此對祖師爺神通發話百依百順~被牽著鼻子走~中了詐術~本身還把它當作神仙在跟你傳話

    已在全台灣遍地開花~用這科技收集民眾個資~供{問事集團}神壇使用~賺取數億暴利~交辦客人做{喜怒哀樂}表情~創造情境模式影響你的腦中判斷力~對你進行洗腦~想法改造~達到委託人~託辦目地~改變你的想法~情緒~多位{心理學老師}機房神通發話~只要有使用{神通傳話}~要你配合在外演戲~做表情動作~配合說話~指示從事任何行為配合,就是有被這集團吸收的老師~機房成員~本身並不需要出面~只需機房神通發話即可

    很多台灣警察都是他旗下老師的客人,對祖師爺{神通傳話法}百依百順~{給他業績}破大案~他的機器設備比測謊機利害,可測出人類腦中想法和影像,馬上就可抓出誰是犯人,告知無法破案的員警

    用此手法~已在台灣橫行十幾年~{控制媒體}沒有在新聞曝光公開過~只要大家跟他配合~每位信眾託辦事務就會無所不能~各別擊破~不被察覺~只要你不配合就用百萬人力資源設局害你~讓你心生畏懼~被迫配合{{請記住曾經看過我這篇文章}}請互相轉告:已傳到海外~請大家一定要看看,並引起警惕~集團背後操控~切勿上當

  1. No trackbacks yet.

Wordpress Social Share Plugin powered by Ultimatelysocial