[实践OK]shell type使用及查找定义的shell函数
Php/Js/Shell/Go jackxiang 2019-10-22 15:58
type用法,查找对应命令的返回值:
type cwww
cwww is an alias for cd /data/www/
k8s里的shell代码运行:
函数检测:
type cwww
cwww is an alias for cd /data/www/
k8s里的shell代码运行:
函数检测:
[实践OK]python 获取服务器IP的脚本
Unix/LinuxC技术 jackxiang 2019-10-22 11:27
原理:应该是默认路由出口IP,它也就是能上网的default路由,发起公网请求的clientIP也就是要获取的服务器IP地址。
10.71.10.40
more:
echo $(python -c "
import socket;s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM);s.connect(('i.api.weibo.com',0));print(s.getsockname())
")
('10.71.10.40', 45847)
换成别的IP也一样能行:
10.71.10.40
more:
echo $(python -c "
import socket;s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM);s.connect(('i.api.weibo.com',0));print(s.getsockname())
")
('10.71.10.40', 45847)
换成别的IP也一样能行:
[实践OK]数组的首地址是一个指针,和单个不一样,数组可以取越界。
Unix/LinuxC技术 jackxiang 2019-10-18 14:53
背景:好久没有摸C了,顺带学一下C语言数组下标的越界是否能访问到东西的问题,是能访问到的,但这些值没有任何意义,可能对于一些黑客有一定意义,但咱不细深入,简单了解一下即可。
cat test.c
#make test
cc test.c -o test
#./test
i[0]===99
i[1]===100
i[2]===101
i[3]===0
i[4]===1559561856
i[5]===32764
*i===99
*(i+1)===100
*(i+2)===101
*(i+3)===0
*(i+4)===1559561856
*(i+5)===32764
*j===99
*(j+1)===100
*(j+2)===101
*(j+3)===0
*(j+4)===1559561856
*(j+5)===32764
===
如果不是整数数组,只是一个定义整数,j=i;是不行的,得:
int a = 6;
int *p = &a;
原因是:数组的首地址是指针,而单个整数变量不是指针,上面这个情况得用&取到其地址赋值给指针变量p,如下:
int *p;
p = &a;
cat test.c
#make test
cc test.c -o test
#./test
i[0]===99
i[1]===100
i[2]===101
i[3]===0
i[4]===1559561856
i[5]===32764
*i===99
*(i+1)===100
*(i+2)===101
*(i+3)===0
*(i+4)===1559561856
*(i+5)===32764
*j===99
*(j+1)===100
*(j+2)===101
*(j+3)===0
*(j+4)===1559561856
*(j+5)===32764
===
如果不是整数数组,只是一个定义整数,j=i;是不行的,得:
int a = 6;
int *p = &a;
原因是:数组的首地址是指针,而单个整数变量不是指针,上面这个情况得用&取到其地址赋值给指针变量p,如下:
int *p;
p = &a;
https://github.com/hexagonal-sun/bic
Installation
You can compile and install bic with the following commands:
autoreconf -i
./configure --enable-debug
make
make install
make出现:
onfigure: WARNING: Expect not found, disabling REPL test cases.
./configure: line 5093: AX_LIB_READLINE: command not found
checking for __gmpz_init in -lgmp... no
configure: error: GNU MP not found, see https://gmplib.org/
========================安装地发现问题=======================
执行autoconf -i是遇到 possibly undefined macro: AM_INIT_AUTOMAKE
尝试运行: autoreconf --install
autoreconf --install
Can't exec "aclocal": No such file or directory at /usr/share/autoconf/Autom4te/FileUtils.pm line 326.
autoreconf: failed to run aclocal: No such file or directory
sudo yum install automake #解决:failed to run aclocal: No such file or directory
#autoreconf --install
configure.ac:8: installing './config.guess'
configure.ac:8: installing './config.sub'
configure.ac:11: installing './install-sh'
configure.ac:11: installing './missing'
src/Makefile.am: installing './depcomp'
configure.ac: installing './ylwrap'
parallel-tests: installing './test-driver'
Installation
You can compile and install bic with the following commands:
autoreconf -i
./configure --enable-debug
make
make install
make出现:
onfigure: WARNING: Expect not found, disabling REPL test cases.
./configure: line 5093: AX_LIB_READLINE: command not found
checking for __gmpz_init in -lgmp... no
configure: error: GNU MP not found, see https://gmplib.org/
========================安装地发现问题=======================
执行autoconf -i是遇到 possibly undefined macro: AM_INIT_AUTOMAKE
尝试运行: autoreconf --install
autoreconf --install
Can't exec "aclocal": No such file or directory at /usr/share/autoconf/Autom4te/FileUtils.pm line 326.
autoreconf: failed to run aclocal: No such file or directory
sudo yum install automake #解决:failed to run aclocal: No such file or directory
#autoreconf --install
configure.ac:8: installing './config.guess'
configure.ac:8: installing './config.sub'
configure.ac:11: installing './install-sh'
configure.ac:11: installing './missing'
src/Makefile.am: installing './depcomp'
configure.ac: installing './ylwrap'
parallel-tests: installing './test-driver'
今天Text Mate2 开源,来自:https://macromates.com/
有点像windows里的editplus.
有点像windows里的editplus.
对域名以及请求模式乃至缓存等过滤:
domain: mi.com is:from-cache
domain: mi.cm is:from-cache method:post
限速:Disable Cahce 右边有一个:online 右邻一个倒三角形。
Throttling Add custom profile...,用来限定网速作下接口和页面渲染测试。
domain: mi.com is:from-cache
domain: mi.cm is:from-cache method:post
限速:Disable Cahce 右边有一个:online 右邻一个倒三角形。
Throttling Add custom profile...,用来限定网速作下接口和页面渲染测试。
背景:运行一个alfred的workflow后(https://www.mac69.com/news/399.html),终端exit;它不退出,不爽,于是找到解决办法了,如下:
解决Mac终端exit退出不爽:
入手Mac后发现各种不爽,比如在终端输入exit命令后,竟然不退出,以下解决:
------->终端
-------->偏好设置
------->描述文件
-------->Shell
--------->单shell退出时:
选择:关闭窗口
————————————————
原文链接:https://blog.csdn.net/u010164190/article/details/60772827
二)mac效率神器alfred热键工作创建流程!用它打开一些应用程序并设置快捷键:
https://www.mac69.com/news/399.html
解决Mac终端exit退出不爽:
入手Mac后发现各种不爽,比如在终端输入exit命令后,竟然不退出,以下解决:
------->终端
-------->偏好设置
------->描述文件
-------->Shell
--------->单shell退出时:
选择:关闭窗口
————————————————
原文链接:https://blog.csdn.net/u010164190/article/details/60772827
二)mac效率神器alfred热键工作创建流程!用它打开一些应用程序并设置快捷键:
https://www.mac69.com/news/399.html
/usr/local/nginx/conf/vhosts/yum.qr.cntv.net.conf
关闭前:
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/xml
Date: Wed, 18 Sep 2019 02:23:28 GMT
ETag: W/"5d80ad08-bb9" 【】
ip_network: 234.253
Last-Modified: Tue, 17 Sep 2019 09:53:12 GMT
Server: nginx
Transfer-Encoding: chunked
Vary: Accept-Encoding
关闭后:
http://yum.qr.cntv.net/centos/6/x86_64/repodata/repomd.xml
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/xml
Date: Wed, 18 Sep 2019 02:18:51 GMT
ip_network: 234.254
Last-Modified: Tue, 17 Sep 2019 09:53:12 GMT
Server: nginx
Transfer-Encoding: chunked
Vary: Accept-Encoding
来自:http://nginx.org/en/docs/http/ngx_http_core_module.html
Syntax: etag on | off;
Default:
etag on;
Context: http, server, location
This directive appeared in version 1.3.3.
二)关闭 if_modified_since off;的方法。
默认是开启的
可以参考两个方案(实践没有成功)
第一在nginx.conf里设置
if_modified_since off|on;
第二在具体的location段里
location ~* \.(?:manifest|appcache|html?|xml|json)$ {
# add_header Last-Modified $date_gmt;
# add_header Last-Modified ""; #不想要就置空
# add_header Cache-Control "public";
}
PS:$date_gmt是内嵌变量,具体参考ngx_http_ssi_module模块
nginx如果打开了SSI模块,会默认关闭header中的last-modified输出
https://blog.csdn.net/weixin_34168700/article/details/92438695
关闭前:
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/xml
Date: Wed, 18 Sep 2019 02:23:28 GMT
ETag: W/"5d80ad08-bb9" 【】
ip_network: 234.253
Last-Modified: Tue, 17 Sep 2019 09:53:12 GMT
Server: nginx
Transfer-Encoding: chunked
Vary: Accept-Encoding
关闭后:
http://yum.qr.cntv.net/centos/6/x86_64/repodata/repomd.xml
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/xml
Date: Wed, 18 Sep 2019 02:18:51 GMT
ip_network: 234.254
Last-Modified: Tue, 17 Sep 2019 09:53:12 GMT
Server: nginx
Transfer-Encoding: chunked
Vary: Accept-Encoding
来自:http://nginx.org/en/docs/http/ngx_http_core_module.html
Syntax: etag on | off;
Default:
etag on;
Context: http, server, location
This directive appeared in version 1.3.3.
二)关闭 if_modified_since off;的方法。
默认是开启的
可以参考两个方案(实践没有成功)
第一在nginx.conf里设置
if_modified_since off|on;
第二在具体的location段里
location ~* \.(?:manifest|appcache|html?|xml|json)$ {
# add_header Last-Modified $date_gmt;
# add_header Last-Modified ""; #不想要就置空
# add_header Cache-Control "public";
}
PS:$date_gmt是内嵌变量,具体参考ngx_http_ssi_module模块
nginx如果打开了SSI模块,会默认关闭header中的last-modified输出
https://blog.csdn.net/weixin_34168700/article/details/92438695
[实践OK]60行C代码实现一个shell计算器计算((3+5)*7-20)/6
Unix/LinuxC技术 jackxiang 2019-9-17 22:29
((3+5)*7-20)/6
div.c plus.c sub.c times.c
./plus 5|./times 7|./sub 20|./div 6
3
6
来自:https://mp.weixin.qq.com/s/0a_T8UKFNiaQueYrUs1TCw
div.c plus.c sub.c times.c
./plus 5|./times 7|./sub 20|./div 6
3
6
来自:https://mp.weixin.qq.com/s/0a_T8UKFNiaQueYrUs1TCw
[实践OK]关于swoole里面的通讯四次挥手问题。
Swoole专题研究 jackxiang 2019-9-17 11:18
server.php
ACCEPT队列(全连接队列):由listen()函数的第二个参数 backlog 指定,内核硬限制由 net.core.somaxconn 限制,即实际的值由min(backlog,somaxconn) 来决定。表示已完成连接的队列,等待被 accept系统调用取走。
php server.php
connection open: 1
[2019-09-17 06:47:18 *9116.0] NOTICE swFactoryProcess_finish (ERRNO 1004): send 25 byte failed, because connection[fd=1] is closed
connection close: 1
client.php
netstat -lantp|grep 6666
tcp 0 0 127.0.0.1:48344 127.0.0.1:6666 FIN_WAIT2 - #客户端进入 FIN_WAIT2 状态
tcp 0 0 127.0.0.1:6666 127.0.0.1:48344 CLOSE_WAIT 9110/php #服务器端进入CLOSE_WAIT
https://blog.csdn.net/Tanswer_/article/details/78375317
SYN队列(半连接队列):由/proc/sys/net/ipv4/tcp_max_syn_backlog指定,表示处于 SYN_RECV 状态的队列
ACCEPT队列(全连接队列):由listen()函数的第二个参数 backlog 指定,内核硬限制由 net.core.somaxconn 限制,即实际的值由min(backlog,somaxconn) 来决定。表示已完成连接的队列,等待被 accept系统调用取走。
原文链接:https://blog.csdn.net/Tanswer_/article/details/78375317
cat /proc/sys/net/ipv4/tcp_max_syn_backlog
65535
cat /proc/sys/net/core/somaxconn
65535
ACCEPT队列(全连接队列):由listen()函数的第二个参数 backlog 指定,内核硬限制由 net.core.somaxconn 限制,即实际的值由min(backlog,somaxconn) 来决定。表示已完成连接的队列,等待被 accept系统调用取走。
php server.php
connection open: 1
[2019-09-17 06:47:18 *9116.0] NOTICE swFactoryProcess_finish (ERRNO 1004): send 25 byte failed, because connection[fd=1] is closed
connection close: 1
client.php
netstat -lantp|grep 6666
tcp 0 0 127.0.0.1:48344 127.0.0.1:6666 FIN_WAIT2 - #客户端进入 FIN_WAIT2 状态
tcp 0 0 127.0.0.1:6666 127.0.0.1:48344 CLOSE_WAIT 9110/php #服务器端进入CLOSE_WAIT
https://blog.csdn.net/Tanswer_/article/details/78375317
SYN队列(半连接队列):由/proc/sys/net/ipv4/tcp_max_syn_backlog指定,表示处于 SYN_RECV 状态的队列
ACCEPT队列(全连接队列):由listen()函数的第二个参数 backlog 指定,内核硬限制由 net.core.somaxconn 限制,即实际的值由min(backlog,somaxconn) 来决定。表示已完成连接的队列,等待被 accept系统调用取走。
原文链接:https://blog.csdn.net/Tanswer_/article/details/78375317
cat /proc/sys/net/ipv4/tcp_max_syn_backlog
65535
cat /proc/sys/net/core/somaxconn
65535
netstat -s | egrep "listen|LISTEN"
Fri May 5 15:39:59 CST 2017
1641906 times the listen queue of a socket overflowed
1641906 SYNs to LISTEN sockets ignored
ss -lnt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 300 *:3307 *:*
LISTEN 0 511 *:80 *:*
ss -lnt
Recv-Q Send-Q Local Address:Port Peer Address:Port
0 50 *:3306 *:*
上面看到的第二列Send-Q 表示第三列的listen端口上的全连接队列最大为50,第一列Recv-Q为全连接队列当前使用了多少
全连接队列的大小取决于:min(backlog, somaxconn) . backlog是在socket创建的时候传入的,somaxconn是一个os级别的系统参数
半连接队列的大小取决于:max(64, /proc/sys/net/ipv4/tcp_max_syn_backlog)。 不同版本的os会有些差异
来自:https://blog.csdn.net/Tanswer_/article/details/78375317
Fri May 5 15:39:59 CST 2017
1641906 times the listen queue of a socket overflowed
1641906 SYNs to LISTEN sockets ignored
ss -lnt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 300 *:3307 *:*
LISTEN 0 511 *:80 *:*
ss -lnt
Recv-Q Send-Q Local Address:Port Peer Address:Port
0 50 *:3306 *:*
上面看到的第二列Send-Q 表示第三列的listen端口上的全连接队列最大为50,第一列Recv-Q为全连接队列当前使用了多少
全连接队列的大小取决于:min(backlog, somaxconn) . backlog是在socket创建的时候传入的,somaxconn是一个os级别的系统参数
半连接队列的大小取决于:max(64, /proc/sys/net/ipv4/tcp_max_syn_backlog)。 不同版本的os会有些差异
来自:https://blog.csdn.net/Tanswer_/article/details/78375317
AirServer投屏pc之iPhone和win10同一个wifi可以通过iphone把内容投递上去:
https://bbs.feng.com/forum.php?mobile=2&mod=viewthread&page=1&tid=11567782
AirServer投屏pc:
https://jingyan.baidu.com/article/495ba841c6491238b30edeba.html
https://bbs.feng.com/forum.php?mobile=2&mod=viewthread&page=1&tid=11567782
AirServer投屏pc:
https://jingyan.baidu.com/article/495ba841c6491238b30edeba.html
用户文件是一个底层且常用的需求。
阅读全文
阅读全文
k8s下容器的内存大小触发OOM
虚拟云与Docker jackxiang 2019-9-2 16:29
背景:出现没有OOM,但是stress子进程反复重启,于是系统负载到118,死机,让机房重启,需要验证为何没有OOM?
container_memory_cache,我们会发现使用的缓存量继续增加,直到container_memory_usage_bytes达到限制,然后开始减少。container_memory_usage_bytes确实考虑了一些正在缓存的文件系统页面。我们还可以看到OOMKiller正在跟踪container_memory_working_set_bytes。这是有道理的,因为共享文件系统缓存页面可以随时从内存中逐出。
也就是说:container_memory_cache ((思考文件系统缓存))平时是不动它的一个值,但是当container_memory_usage_bytes伴随container_memory_usage_bytes的增长而增长,container_memory_usage_bytes增长到设定的limit 200M后,发现container_memory_usage_bytes还继续增长,那么它会把container_memory_cache的内存给用掉。
来自:https://medium.com/faun/how-much-is-too-much-the-linux-oomkiller-and-used-memory-d32186f29c9d
kubectl get pod memory-demo-2 --namespace=mem-example
这时候,容器可能会运行,也可能会被杀掉。如果容器还没被杀掉,重复之前的命令直至 你看到这个容器被杀掉:
NAME READY STATUS RESTARTS AGE
memory-demo-2 0/1 OOMKilled 1 24s
来自:https://www.cnblogs.com/weifeng1463/p/10174432.html
相关测试的yaml:https://kubernetes.io/docs/tasks/configure-pod-container/assign-memory-resource/
container_memory_cache,我们会发现使用的缓存量继续增加,直到container_memory_usage_bytes达到限制,然后开始减少。container_memory_usage_bytes确实考虑了一些正在缓存的文件系统页面。我们还可以看到OOMKiller正在跟踪container_memory_working_set_bytes。这是有道理的,因为共享文件系统缓存页面可以随时从内存中逐出。
也就是说:container_memory_cache ((思考文件系统缓存))平时是不动它的一个值,但是当container_memory_usage_bytes伴随container_memory_usage_bytes的增长而增长,container_memory_usage_bytes增长到设定的limit 200M后,发现container_memory_usage_bytes还继续增长,那么它会把container_memory_cache的内存给用掉。
来自:https://medium.com/faun/how-much-is-too-much-the-linux-oomkiller-and-used-memory-d32186f29c9d
kubectl get pod memory-demo-2 --namespace=mem-example
这时候,容器可能会运行,也可能会被杀掉。如果容器还没被杀掉,重复之前的命令直至 你看到这个容器被杀掉:
NAME READY STATUS RESTARTS AGE
memory-demo-2 0/1 OOMKilled 1 24s
来自:https://www.cnblogs.com/weifeng1463/p/10174432.html
相关测试的yaml:https://kubernetes.io/docs/tasks/configure-pod-container/assign-memory-resource/
swoole实现redis连接池CoroutineChannel核心原理。
Swoole专题研究 jackxiang 2019-8-30 16:24
Channel->push :当队列中有其他协程正在等待pop数据时,自动按顺序唤醒一个消费者协程。当队列已满时自动yield让出控制器,等待其他协程消费数据
Channel->pop:当队列为空时自动yield,等待其他协程生产数据。消费数据后,队列可写入新的数据,自动按顺序唤醒一个生产者协程。
Coroutine\Channel使用本地内存,不同的进程之间内存是隔离的。只能在同一进程的不同协程内进行push和pop操作
Coroutine\Channel在2.0.13或更高版本可用
作者:逸宸a
链接:https://www.jianshu.com/p/ed71cb92050d
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
来自:https://www.jianshu.com/p/ed71cb92050d
https://www.jianshu.com/p/ed71cb92050d
Channel->pop:当队列为空时自动yield,等待其他协程生产数据。消费数据后,队列可写入新的数据,自动按顺序唤醒一个生产者协程。
Coroutine\Channel使用本地内存,不同的进程之间内存是隔离的。只能在同一进程的不同协程内进行push和pop操作
Coroutine\Channel在2.0.13或更高版本可用
作者:逸宸a
链接:https://www.jianshu.com/p/ed71cb92050d
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
来自:https://www.jianshu.com/p/ed71cb92050d
https://www.jianshu.com/p/ed71cb92050d
并发和并行的区别
Unix/LinuxC技术 jackxiang 2019-8-30 11:01
并发与并行是两个既相似而又不相同的概念
并发性,又称共行性,是指能处理多个同时性活动的能力
并行是指同时发生的两个并发事件,具有并发的含义
而并发则不一定并行,也亦是说并发事件之间不一定要同一时刻发生。
并发的实质是一个物理CPU(也可以多个物理CPU) 在若干道程序之间多路复用,并发性是对有限物理资源强制行使多用户共享以提高效率。
并行性指两个或两个以上事件或活动在同一时刻发生。在多道程序环境下,并行性使多个程序同一时刻可在不同CPU上同时执行。
所有的并发处理都有排队等候,唤醒,执行至少三个这样的步骤.所以并发肯定是宏观概念,在微观上他们都是序列被处理的,只不过资源不会在某一个上被阻塞(一般是通过时间片轮转),所以在宏观上看多个几乎同时到达的请求同时在被处理。如果是同一时刻到达的请求也会根据优先级的不同,而先后进入队列排队等候执行。
并发性,又称共行性,是指能处理多个同时性活动的能力
并行是指同时发生的两个并发事件,具有并发的含义
而并发则不一定并行,也亦是说并发事件之间不一定要同一时刻发生。
并发的实质是一个物理CPU(也可以多个物理CPU) 在若干道程序之间多路复用,并发性是对有限物理资源强制行使多用户共享以提高效率。
并行性指两个或两个以上事件或活动在同一时刻发生。在多道程序环境下,并行性使多个程序同一时刻可在不同CPU上同时执行。
所有的并发处理都有排队等候,唤醒,执行至少三个这样的步骤.所以并发肯定是宏观概念,在微观上他们都是序列被处理的,只不过资源不会在某一个上被阻塞(一般是通过时间片轮转),所以在宏观上看多个几乎同时到达的请求同时在被处理。如果是同一时刻到达的请求也会根据优先级的不同,而先后进入队列排队等候执行。
TimeWait过多时,两个方面做处理:
1)打开:
cat /etc/sysctl.conf|grep -Eri "reuse|timestamps|local_port_range"
net.ipv4.ip_local_port_range = 2000 65000 #CS模型的C端端口范围增大到65000
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_tw_reuse = 1 #这个是重用客户端的四元里的二元,这个容易和tcp_tw_recycle 记混,下面这个tcp_tw_recycle这个项最好关掉,容易出现并引发疑难问题。
如果是安全可控制,可以复用处于TIME_WAIT的套接字为新的连接所用。1)只适用于连接发起方。 也就是CS模型的客户端。2)对应TIME_WAIT状态的连接创建超过1秒才可以被复用。所以,上面这个net.ipv4.tcp_timestamps = 1 ,也就是是打开对TCP时间戳的支持,默认即为1秒。
net.ipv4.ip_local_port_range = 1024 65535 #调大
2)关闭:
不要开启:net.ipv4.tcp_tw_recycle = 1 #不关容易出现并引发疑难问题
cat /etc/sysctl.conf|grep -Eri "tcp_tw_recycle"
net.ipv4.tcp_tw_recycle = 1
=======================================================================
出现在redis在PHP里主动关闭高并发时候,redis在php-fpm请求完关了,可能是php主动关了,被动方认为有错误发生。
taimwait主要是把本地发起请求的端口范围给占满了,出现client不可用新端口client到server。
假设发起主动关闭的一方(client)最后发送的ACK在网络中丢失,由于TCP协议的重传机制,执行被动关闭的一方(server)将会重发其FIN,在该FIN到达client之前,client必须维护这条连接状态,也就说这条TCP连接所对应的资源(client方的local_ip,local_port)不能被立即释放或重新分配,直到另一方重发的FIN达到之后,client重发ACK后,经过2MSL时间周期没有再收到另一方的FIN之后,该TCP连接才能恢复初始的CLOSED状态。如果主动关闭一方不维护这样一个TIME_WAIT状态,那么当被动关闭一方重发的FIN到达时,主动关闭一方的TCP传输层会用RST包响应对方,这会被对方认为是有错误发生,然而这事实上只是正常的关闭连接过程,并非异常。
摘自:https://blog.csdn.net/huangyimo/article/details/81505558
参数调整:
CentOS 大量的TIME_WAIT解决方法:
TIME_WAIT状态的连接,通过调整内核参数解决,
vi /etc/sysctl.conf 编辑文件,加入以下内容:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30 然后执行
/sbin/sysctl -p让参数生效。
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间
修改之后,再用
netstat -n -p -t发现大量的TIME_WAIT 已不存在,网站访问正常!
来自:https://www.bbsmax.com/A/ZOJPgOYyzv/
1)打开:
cat /etc/sysctl.conf|grep -Eri "reuse|timestamps|local_port_range"
net.ipv4.ip_local_port_range = 2000 65000 #CS模型的C端端口范围增大到65000
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_tw_reuse = 1 #这个是重用客户端的四元里的二元,这个容易和tcp_tw_recycle 记混,下面这个tcp_tw_recycle这个项最好关掉,容易出现并引发疑难问题。
如果是安全可控制,可以复用处于TIME_WAIT的套接字为新的连接所用。1)只适用于连接发起方。 也就是CS模型的客户端。2)对应TIME_WAIT状态的连接创建超过1秒才可以被复用。所以,上面这个net.ipv4.tcp_timestamps = 1 ,也就是是打开对TCP时间戳的支持,默认即为1秒。
net.ipv4.ip_local_port_range = 1024 65535 #调大
2)关闭:
不要开启:net.ipv4.tcp_tw_recycle = 1 #不关容易出现并引发疑难问题
cat /etc/sysctl.conf|grep -Eri "tcp_tw_recycle"
net.ipv4.tcp_tw_recycle = 1
=======================================================================
出现在redis在PHP里主动关闭高并发时候,redis在php-fpm请求完关了,可能是php主动关了,被动方认为有错误发生。
taimwait主要是把本地发起请求的端口范围给占满了,出现client不可用新端口client到server。
假设发起主动关闭的一方(client)最后发送的ACK在网络中丢失,由于TCP协议的重传机制,执行被动关闭的一方(server)将会重发其FIN,在该FIN到达client之前,client必须维护这条连接状态,也就说这条TCP连接所对应的资源(client方的local_ip,local_port)不能被立即释放或重新分配,直到另一方重发的FIN达到之后,client重发ACK后,经过2MSL时间周期没有再收到另一方的FIN之后,该TCP连接才能恢复初始的CLOSED状态。如果主动关闭一方不维护这样一个TIME_WAIT状态,那么当被动关闭一方重发的FIN到达时,主动关闭一方的TCP传输层会用RST包响应对方,这会被对方认为是有错误发生,然而这事实上只是正常的关闭连接过程,并非异常。
摘自:https://blog.csdn.net/huangyimo/article/details/81505558
参数调整:
CentOS 大量的TIME_WAIT解决方法:
TIME_WAIT状态的连接,通过调整内核参数解决,
vi /etc/sysctl.conf 编辑文件,加入以下内容:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30 然后执行
/sbin/sysctl -p让参数生效。
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间
修改之后,再用
netstat -n -p -t发现大量的TIME_WAIT 已不存在,网站访问正常!
来自:https://www.bbsmax.com/A/ZOJPgOYyzv/