运维杂记-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/
 
原文地址:https://www.cnblogs.com/xiewenming/p/7441601.html