• 运维杂记-01


    #########socket tcp 系统调优#############

    什么是socket?

    Socket 五元组  1.源ip地址  2. 源端口 3.目的ip地址  4.目的端口  5.类型 TCP or UDP

     tcp报头如下:tcp首部报头20字节 其中目的端口和源端口分别是16bit,就是2**16-1个可用端口,0-65536 因为0不能用就减一 65535个

    在Centos7中可以查看可以使用的端口数

    [root@192-168-13-165 ~]# cat /proc/sys/net/ipv4/ip_local_port_range 
    32768	60999
    #下面是更改方法,一般不建议增加10000以下的端口,因为有些服务可能会使用10000以下#的端口容易引起冲突
    [root@192-168-13-165 ~]# echo "10000 65000" > /proc/sys/net/ipv4/ip_local_port_range 
    [root@192-168-13-165 ~]# cat /proc/sys/net/ipv4/ip_local_port_range 
    10000	65000
    

    可以尝试用ab测试看是否能测试错socket限制问题,模拟发送2万个请求,2000的并发来测试百度

    [root@192.168.13.165]#ab -n 10000 -c 2000 https://www.baidu.com/
    This isApacheBench, Version 2.3 <$Revision: 1430300 $>
    Copyright 1996Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    Licensed to TheApache Software Foundation, http://www.apache.org/
     
    Benchmarkingwww.baidu.com (be patient)
    socket: Toomany open files (24)
    

    报错我们很容易看懂了socket: Too many open files (24) 不能打开太多的文件。我们使用ulimit来看看系统资源限制。

    [root@test ~]# ulimit -a
    core file size          (blocks, -c) 0
    data seg size           (kbytes, -d) unlimited
    scheduling priority             (-e) 0
    file size               (blocks, -f) unlimited
    pending signals                 (-i) 31219
    max locked memory       (kbytes, -l) 64
    max memory size         (kbytes, -m) unlimited
    open files                      (-n) 1024
    (省略部分输出)
    

    没错,默认情况下,当前用户能够打开的文件数量最大是1024,但是这个和我们使用ab测试有什么关系呢?ab测试创建的不是socket吗?如果你不理解,那就要回归本质,想想我们刚刚学习Linux的时候,经常听到的一句Linux的思想“一切皆文件”!谁说socket不是一个文件呢?

    可以使用ulimit –n来修改当前用户、当前session的限制,也可以修改配置文件/etc/security/limits.conf来彻底解决这个问题,这也是进行系统性能调优的必备基础。


    NetCat检查nc,在网络工具中有“瑞士军刀”美誉,其有Windows和Linux的版本。可通过TCP或UDP协议传输读写数据。同时,它还是一个网络应用Debug分析器,因为它可以根据需要创建各种不同类型的网络连接。

    作用:1.远程拷贝文件  2.克隆硬盘或分区 3.端口扫描 4.保存Web页面 5.模拟HTTP Headers  6.聊天 7.传输目录  详细见http://www.cnblogs.com/lpfuture/p/4638335.html

    我这里用于演示tcp socket连接

    [root@192-168-13-21 ~]# nc -l -4 -p 8888 -k
    hah
    hello
    [root@192-168-13-201 ~]# nc 192.168.13.21 8888
    hah
    hello
    ^C
    #当13.201 ctrl C的时候查看网络连接状态为TIME_WAIT
    [root@192-168-13-201 ~]# netstat -an |grep 192.168.13.21
    tcp        0      0 192.168.13.201:53667         192.168.13.21:8888           TIME_WAIT   
    #在查看13.21
    [root@192-168-13-21 ~]# netstat -an |grep 192.168.13.201
    
    #当13.21 ctrl C的时候查看网络连接状态为TIME_WAIT
    [root@192-168-13-21 ~]# nc -l -4 -p 8888 -k
    hah
    ^C
    [root@192-168-13-21 ~]# netstat -an |grep 192.168.13.201
    tcp        0      0 192.168.13.21:8888       192.168.13.201:53671     TIME_WAIT  
    [root@192-168-13-201 ~]# netstat -an |grep 192.168.13.21
     #从上面的实验中可以判断出TCP的TIME_WAIT状态只会出现在主动端口的一方!!!
    [root@192-168-13-21 ~]# lsof -i:8888  #listopenfile 的简写
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    nc 1631 root 3u IPv4 1038816226 0t0 TCP *:ddi-tcp-1 (LISTEN)
    nc 1631 root 4u IPv4 1038828329 0t0 TCP 192-168-13-21:ddi-tcp-1->192.168.13.201:53681 (ESTABLISHED)

    还有一种叫做伪终端发送数据

    [root@192-168-13-201 ~]# echo "hehe" > /dev/tcp/192.168.13.21/8888
    服务器端用nc监听8888就能收到hehe
    

    如果有大量的TIME_WAIT存在,那么这个套接字对是不释放的,不释放也就代表着占用一个,资源嘛,占用一个就少一个。

    下图实线为tcp 三次握手和四次断开客户端的状态变化过程,虚线为服务器端状态变化过程

    状态图来自赵班长:

    4次挥手

    4次挥手,是全双工通讯决定断开为什么要4次,对数据传输负责,断开需要确认
    第一张图中的2msl 在linux上是60s,用于什么数据包迷路之类 还没弄清楚
    timewait多了主要占用了socket,实际上 cpu 和内存资源占的很少。
    所以在服务器一般对socket进行调优
    #tcp时间戳 (1为打开 0为关闭)
    [root@192-168-13-165 ~]# cat /proc/sys/net/ipv4/tcp_timestamps 
    1
    
    #tcp socket复用 (1为打开 0为关闭) 尽量用复用连接,这个配置主要影响的是Web服务器到DB服务器的连接复用,因为服务器是客户端
    [root@192-168-13-165 ~]# cat /proc/sys/net/ipv4/tcp_tw_reus
    0
    #tcp socket快速回收 (1为打开 0为关闭) 
    [root@192-168-13-165 ~]# cat /proc/sys/net/ipv4/tcp_tw_recycle 
    0

    1.socket 复用是根据时间戳 默认已经打开,reuse 打开前提是时间戳必须打开。
    2.当客户端处于nat网络中 不能打开快速回收,一般在负载均衡器上是不开的
    ps:
    1.socket是有限的 1-65535,从另一个角度来说多ip可以解socket数量不足问题。
    2.nginx不支持多ip发起请求,haproxy支持多ip发起请求
    3.自己写程序一般要支持多ip发起请求,就是为了可扩展socket数量。
    #############################end#########################

    ########nginx相关###########

    keep-alive在nginx中keepalive_timeout

    长连接多了cpu资源,少了可能就慢,因为用户要多次连接。如果在连接数很大的情况下,设置30s到60s的keepalive_timeout区别会很大,并发的连接数可能飙升,长连接打开需要权衡,包括php到mysql的连接,要看mysql的最大连接数支持和性能等情况。

    Sendfile 函数在两个文件描述符之间直接传递数据(完全在内核中操作,传送),从而避免了内核缓冲区数据和用户缓冲区数据之间的拷贝,操作效率很高,被称之为零拷贝。
    sendfile的详细解释见 http://blog.csdn.net/hnlyyk/article/details/50856268
    tcp_nopush on ? 一次报头 数据多次发送
    tcp_nodelay on ?
    以上2个参数不能同时用
    nginx进程 master一般是不处理请求
    master只进行管理worker进程
    nginx如何做滚动升级?会有2个master进程存在,老的处理完 新的接收
    nginx reload 就滚动的,如果是下载的请求 nginx reload 可能会有问题,会有很多的worker进程挂起
    如果不reload 动态的就实现变更,通过接口的方式?
    把lua内嵌的nginx 用lar实现nginx的负载均衡
     
    cookie 保存一些服务器的信息 比如 购物车,服务器端保存在redis里面保留1个月
    ping.chainaz.com 分布式检查网站等工具
    ###########nginx end#############
     
    #####安装服务 三步走######
    安装
      1.包管理工具 yum apt-get
         2.编译安装 ./configure  make 也是一种编译器c c++
               java:ant maven gradle
            3.二进制
    配置:
             1.网络 2.路径 3.容量 4.性能 5.安全 6.功能 7 日志 。。。。
    启动:
             1.systemctl service
             2.../执行
             3.nohup  screen(推荐)
    管理:
    优化:
    ############end###############
    ############系统相关#############
    存储:
    文件存储 块存储 对象存储
    redis 写个几十G就差不多了   
    内存页默认4096 磁盘块默认block 4096 
                     
    LevelDB(SSDB 360开发的支持大数据存储)
     
    cpu运行级别 ring0(特权模式) ring1 ring2 ring3(用户模式)
    系统调用 就会进入内核态
    cpu 上下文切换,linux 默认cpu切换一个时间片是多少?(作业)
    cpu的寄存器 进程调度 优先级
    让linux系统尽量的不使用交换分区,越低用的越少
    如何让linux尽量的不使用交换分区,越低用的越少
    [root@192-168-13-165 ~]# cat /proc/sys/vm/swappiness 
    60
    
    缺页中断 cpu ---内存----硬盘(cpu要数据的顺序,cpu只往内存要数据)
    io调度算法 centos6
    [root@192-168-13-165 ~]# cat /sys/block/sda/queue/scheduler 
    noop anticipatory deadline [cfq] 
    

    io调度算法 centos7

    [test@192-168-13-164 ~]$ cat /sys/block/sda/queue/scheduler 
    noop [deadline] cfq
    ssd 把调度算法 一定用noop,cfq 是完全公平的调度算法
     
    apache用的 select nginx用epoll (多路io复用)

    临地更改I/O调度方法:
    例如:想更改到noop电梯调度算法:

    echo noop > /sys/block/sda/queue/scheduler

    想永久的更改I/O调度方法:
    修改内核引导参数,加入elevator=调度程序名

    vi /boot/grub/menu.lst

    更改到如下内容:

    kernel /boot/vmlinuz-2.6.18-8.el5 ro root=LABEL=/ elevator=deadline rhgb quiet

    重启之后,查看调度方法:

    cat /sys/block/sda/queue/scheduler
    noop anticipatory [deadline] cfq

    已经是deadline了

    ##################end#####################
    ##################others#################
    断点续传的状态码是什么?http 206  通过http头里面的range
    浏览器边下载边渲染,从上往下,不同的浏览器对单域名并发是有限的,可能是8或者其它值
    浏览器还有一种懒加载说法,默认不往下面拉就不加载下面的内容的
    浏览器加载到js 会先读取,然后执行,执行完了以后再继续往下面加载,所有js一般放在html的最下面
    web架构如果访问量小可以用
    nginx(代理)+(nginx(7层处理)+tomcat 不记录日志只处理动态请求)
     
    赵班长推荐的书:unix网络编程卷1  性能之巅 abs
    相关的技术文章推荐:
    运维知识体系:
    https://www.unixhot.com/page/ops
    nginx结合waf:
    https://github.com/unixhot/waf
    单台服务器tcp最大连接数
    cpu io 内存
    http://os.51cto.com/art/201012/240476.htm
    前端优化
    linux 微观角度是不区分进程和线程的,理论上进程是包括线程的,线程共享内存空间,进程的内存空间是独立的
    www.cnbolgs.com/wxisme/p/6212797.html  (http)
    高级shell编程脚本
    http://www.linuxplus.org/kb/
    linux系统tcp优化
    http://joyexpr.com/2013/11/22/c100k-4-kernel-tuning/
     
  • 相关阅读:
    centos7 查看启动ntp服务命令
    集群重启某一主机下所有osd down解决办法
    不卸载ceph重新获取一个干净的集群环境
    centos7 中文乱码解决方法
    ceph-deploy mon add 失败
    批量删除osd的shell脚本
    搭建自己的框架WedeNet(二)
    搭建自己的框架WedeNet(一)
    多线程总结
    C#中操作单个cookie和cookie字典
  • 原文地址:https://www.cnblogs.com/xiewenming/p/7441601.html
Copyright © 2020-2023  润新知