Blog

  • 使用nat时net.ipv4.tcp_timestamps参数

    在使用 iptables 做 nat 时,发现内网机器 ping 某个域名 ping 的通,而使用 curl 测试不通

    原来是 net.ipv4.tcp_timestamps 设置了为 1 ,即启用时间戳

    cat /proc/sys/net/ipv4/tcp_timestamps

    这时将其关闭

    修改 /etc/sysctl.conf 中

    net.ipv4.tcp_timestamps = 0
    sysctl -p

    生效

    原理

    问题出在了 tcp 三次握手,ping 的通 icmp ok ,http ssh mysql 都不 ok

    经过nat之后,如果前面相同的端口被使用过,且时间戳大于这个链接发出的syn中的时间戳,服务器上就会忽略掉这个syn,不返会syn-ack消息,表现为用户无法正常完成tcp3次握手,从而不能打开web页面。在业务闲时,如果用户nat的端口没有被使用过时,就可以正常打开;业务忙时,nat端口重复使用的频率高,很难分到没有被使用的端口,从而产生这种问题。

    只有客户端和服务端都开启时间戳的情况下,才会出现能ping通不能建立tcp三次握手的情况

     

  • php array merge

    两个数组合并为一个数组

    $a = array(1 => 1, 2 => 2, 3 => 3);
    $b = array(3 => 3, 5 => 5, 6 => 6);
    $c = $a + $b;
    print_r($c);
    

    结果

    Array
    (
        [1] => 1
        [2] => 2
        [3] => 3
        [5] => 5
        [6] => 6
    )
    
  • ab测试

    centos6

    安装

    yum install httpd-tools

    -c 并发数
    -n 总请求数

    ab -c 100 -n 10000 http://www.abc.com/
  • shell下的三元表达式

    如果第一部分成功则执行第二部分

    否则就执行第三部分

    nginx -s reload &&  echo 'nginx 重新载入成功' || echo 'nginx 重新载入失败'

    基本就的实现

  • 理解iops

    IOPS和数据吞吐量适用于不同的场合:
    读取10000个1KB文件,用时10秒 Throught(吞吐量)=1MB/s ,IOPS=1000 追求IOPS
    读取1个10MB文件,用时0.2秒 Throught(吞吐量)=50MB/s, IOPS=5 追求吞吐量

  • nf_conntrack: table full, dropping packet.问题解决

    centos6下在并发量大的时候出现这样的报错

    nf_conntrack: table full, dropping packet.
    nf_conntrack: table full, dropping packet.
    nf_conntrack: table full, dropping packet.

    看一下 nf_conntrack 表里的记录及数量

    less /proc/net/nf_conntrack

    wc -l /proc/net/nf_conntrack

    如果表满了会连 ssh 都连不上来

    默认表的最大值是 65535

    cat /proc/sys/net/nf_conntrack_max

    需要临时加大

    echo ‘100000’ > /proc/sys/net/nf_conntrack_max

    需要永久生效

    在 /etc/sysctl.conf 里添加

    net.nf_conntrack_max = 655360
    net.netfilter.nf_conntrack_max = 655350
    net.netfilter.nf_conntrack_tcp_timeout_established = 1200

    这里有个坑,如果在没有开启 iptables 的情况下使用

    iptables -L -t nat

    会导致加载 nf_conntrack 并使用默认值, sysctl 里的值就不生效了

    这时需要重启一下 iptables 才能加载 sysctl 中的值