背景:502 Bad Gateway nginx问题,再次排查~~~keepalive_timeout 1800; 是不是太大了,浏览器访问没有关闭会一直连接状态,这块是否有必要不keepalive呢?http1.1中默认的keep-alive为connection(使用持久化连接),在http1.0中则默认为close,在大并发量的情况下可能需要将客户端的连接close掉,以保障服务器的正常运转。(因为每一台服务器它所能建立的最大连接数是有上限的,lnux下ulimit n xxx),nginx不像apache,直接有指令keep-alive off/on;它使用的是keepalive_timeout [time],默认的时长为75,可以在http、server、location使用此指令。keepalive_timeout 0; 来自:http://www.cnblogs.com/meteoric_cry/archive/2011/06/07/2074150.html
问题:established 很多的问题,发现我的web机器上面的ESTABLISHED链接数暴多,机器环境是nginx+mysql+fastcgi的
我打开一个页面发现有10来个ESTABLISHED状态链接,页面加载完了状态还在,大慨要过1分钟才
完成这个状态,我把打开的页面关闭掉后ESTABLISHED的链接还要过20秒才释放,
nginx的 keepalive_timeout 30
内核的一些参数都改的比较小
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 800
实践得出如下参数:
新的发现,及解释:
一)但uptime变大了,以前3,现在变8:
uptime
16:02:20 up 46 days, 21 min, 1 user, load average: 11.99, 8.60, 6.66
二)timewait变大:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 428
FIN_WAIT1 6
ESTABLISHED 16
FIN_WAIT2 8
SYN_RECV 2
因没有复用socket里的ulimit句柄,导致系统负载变大,再就是出现了性能上的降低表现在TIME_WAIT数量变多~
linux下默认是不产生core文件的,要用ulimit -c unlimited放开,这儿的socket句柄不释放也是通过: ulimint -a 里的 open files (-n) 65535 实现的,
所以使用下面的命令: ulimit -n 65535 并不能有效的解决这个问题。直接这么修改open files 不能得到保持。下面给出的方法最简单和最直接: 修改/etc/security/limits.conf 添加如下一行: * - nofile 65535 修改/etc/pam.d/login添加如下一行 session required /lib/security/pam_limits.so 最重要的,修改完这些后,要重新登录下才行,不然该session的句柄数不会生效。
ulimit 功能简述
假设有这样一种情况,当一台 Linux 主机上同时登陆了 10 个人,在系统资源无限制的情况下,这 10 个用户同时打开了 500 个文档,而假设每个文档的大小有 10M,这时系统的内存资源就会受到巨大的挑战。
摘自:http://www.cnblogs.com/wangkangluo1/archive/2012/06/06/2537677.html
自己博客参看,Linux查看文件句柄占用多的进程 ,查看Linux某进程的句柄数,并通过ulimit -n 单个进程打开的最大文件句柄数量限制解决accept4() failed (24: Too many open files):http://jackxiang.com/post/6570/
————————————————————————————————————————————————————————————————————————————
请问下各位让ESTABLISHED 能快速完成释放还有哪些地方要注意的,不然的话造成大量的ESTABLISHED链接
HTTP/1.1 是允许 keepalive 的,这样可以降低服务器的负载
你要是仅仅想减少 ESTABLISHED,大可以在 nginx 上禁止 keepalive
这样虽然可以实现你的需求,但却与你所希望的结果大相径庭
对 我需要的是减低机器的负载,keepalive肯定也是要开的,可能是内核某些参数设置过大了,导致ESTABLISHED状态保持时间太长,
动不动就是好几百上千的ESTABLISHED 机器负责有点高
不是多不多的问题,是我把页面关了这个状态要过30秒才回收,这时间太久了,正常的话应该是页面刷新完了这个状态就完成了
或者说页面关闭了这个状态就完成了,而不是要过很成时间才完成这个状态
是通过 netstat 看的吗?
如果是,顺便也看一下 Recv-Q 和 Send-Q 那两列,看是 0 还是什么
显示Recv-Q 和 Send-Q 那两列,都是0
netstat -tl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 jackxiang.com:8012 *:* LISTEN
tcp 0 0 jackxiang.com:9004 *:* LISTEN
tcp 0 0 jackxiang.com:9005 *:* LISTEN
tcp 0 0 jackxiang.com:8013 *:* LISTEN
tcp 0 0 *:5901 *:* LISTEN
tcp 0 0 jackxiang.com:8015 *:* LISTEN
tcp 0 0 *:sunrpc *:* LISTEN
tcp 0 0 *:http *:* LISTEN
tcp 0 0 jackxiang.com:x11 *:* LISTEN
tcp 0 0 jackxiang.com:cddbp-alt *:* LISTEN
tcp 0 0 jackxiang.com:8017 *:* LISTEN
tcp 0 0 *:6001 *:* LISTEN
tcp 0 0 *:ssh *:* LISTEN
tcp 0 0 jackxiang.com:socks *:* LISTEN
tcp 0 0 localhost:smtp *:* LISTEN
tcp 0 0 *:https *:* LISTEN
tcp 0 0 *:34139 *:* LISTEN
tcp 0 0 jackxiang.com:irdmi *:* LISTEN
tcp 0 0 jackxiang.com:mcreport *:* LISTEN
tcp 0 0 jackxiang.com:8006 *:* LISTEN
tcp 0 0 jackxiang.com:cslistener *:* LISTEN
tcp 0 0 jackxiang.com:8009 *:* LISTEN
tcp 0 0 jackxiang.com:etlservicemgr *:* LISTEN
tcp 0 0 jackxiang.com:8010 *:* LISTEN
tcp 0 0 *:sunrpc *:* LISTEN
tcp 0 0 *:webcache *:* LISTEN
tcp 0 0 *:6001 *:* LISTEN
tcp 0 0 *:ssh *:* LISTEN
tcp 0 0 *:60763 *:* LISTEN
我做了一个实验,如果是 keepalive 的情况,默认浏览器不关闭,连接就不断开
即使你不再有任何页面的访问操作,连接也一直保持,直到浏览器关闭为止
因此,初步判断,你的 ESTABLISHED 过多的原因是大多数人不关闭浏览器造成的,你自己也可以试验一下
如果想缩短这个,可以修改 webserver 的配置
因为现在的浏览器都是支持keepalive并遵守服务器配置,我试验了也是这样的
要把整个浏览器关了才会没有ESTABLISHED ,楼上的请问下在nginx上怎么主动断开,可以试验下看性能和速度方面会不会有影响
以上讨论来自:
http://bbs.chinaunix.net/thread-1945952-2-1.html
————————————————————————————————————————————————————————————————
导致服务器load过高
send_timeout
syntax: send_timeout the time
default: send_timeout 60
context: http, server, location
Directive assigns response timeout to client. Timeout is established not on entire transfer of answer, but only between two operations of reading, if after this time client will take nothing, then nginx is shutting down the connection.
应该是tcp连接没有释放造成的,我最近也碰到这个问题
其中的SYN_RECV表示正在等待处理的请求数;ESTABLISHED表示正常数据传输状态;TIME_WAIT表示处理完毕,等待超时结束的请求数。
具体如下:
状态:描述
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉
Tcp图解:

获取Windows下的Established的bat自动脚本备案,指定进程的网络连接状态为established的连接数:
文库:http://wenku.baidu.com/link?url=NJKFU95Elz0RjW6MV99qhoVdcSz7OLxvOoPhdnoOMGb_mKMUVysGxc8GhqSXG7pwuyY5fuNQEW2iyQGzT1DzraPI6kv3l4RzVvszkn3SUl3
问题:established 很多的问题,发现我的web机器上面的ESTABLISHED链接数暴多,机器环境是nginx+mysql+fastcgi的
我打开一个页面发现有10来个ESTABLISHED状态链接,页面加载完了状态还在,大慨要过1分钟才
完成这个状态,我把打开的页面关闭掉后ESTABLISHED的链接还要过20秒才释放,
nginx的 keepalive_timeout 30
内核的一些参数都改的比较小
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 800
实践得出如下参数:
新的发现,及解释:
一)但uptime变大了,以前3,现在变8:
uptime
16:02:20 up 46 days, 21 min, 1 user, load average: 11.99, 8.60, 6.66
二)timewait变大:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 428
FIN_WAIT1 6
ESTABLISHED 16
FIN_WAIT2 8
SYN_RECV 2
因没有复用socket里的ulimit句柄,导致系统负载变大,再就是出现了性能上的降低表现在TIME_WAIT数量变多~
linux下默认是不产生core文件的,要用ulimit -c unlimited放开,这儿的socket句柄不释放也是通过: ulimint -a 里的 open files (-n) 65535 实现的,
所以使用下面的命令: ulimit -n 65535 并不能有效的解决这个问题。直接这么修改open files 不能得到保持。下面给出的方法最简单和最直接: 修改/etc/security/limits.conf 添加如下一行: * - nofile 65535 修改/etc/pam.d/login添加如下一行 session required /lib/security/pam_limits.so 最重要的,修改完这些后,要重新登录下才行,不然该session的句柄数不会生效。
ulimit 功能简述
假设有这样一种情况,当一台 Linux 主机上同时登陆了 10 个人,在系统资源无限制的情况下,这 10 个用户同时打开了 500 个文档,而假设每个文档的大小有 10M,这时系统的内存资源就会受到巨大的挑战。
摘自:http://www.cnblogs.com/wangkangluo1/archive/2012/06/06/2537677.html
自己博客参看,Linux查看文件句柄占用多的进程 ,查看Linux某进程的句柄数,并通过ulimit -n 单个进程打开的最大文件句柄数量限制解决accept4() failed (24: Too many open files):http://jackxiang.com/post/6570/
————————————————————————————————————————————————————————————————————————————
请问下各位让ESTABLISHED 能快速完成释放还有哪些地方要注意的,不然的话造成大量的ESTABLISHED链接
HTTP/1.1 是允许 keepalive 的,这样可以降低服务器的负载
你要是仅仅想减少 ESTABLISHED,大可以在 nginx 上禁止 keepalive
这样虽然可以实现你的需求,但却与你所希望的结果大相径庭
对 我需要的是减低机器的负载,keepalive肯定也是要开的,可能是内核某些参数设置过大了,导致ESTABLISHED状态保持时间太长,
动不动就是好几百上千的ESTABLISHED 机器负责有点高
不是多不多的问题,是我把页面关了这个状态要过30秒才回收,这时间太久了,正常的话应该是页面刷新完了这个状态就完成了
或者说页面关闭了这个状态就完成了,而不是要过很成时间才完成这个状态
是通过 netstat 看的吗?
如果是,顺便也看一下 Recv-Q 和 Send-Q 那两列,看是 0 还是什么
显示Recv-Q 和 Send-Q 那两列,都是0
netstat -tl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 jackxiang.com:8012 *:* LISTEN
tcp 0 0 jackxiang.com:9004 *:* LISTEN
tcp 0 0 jackxiang.com:9005 *:* LISTEN
tcp 0 0 jackxiang.com:8013 *:* LISTEN
tcp 0 0 *:5901 *:* LISTEN
tcp 0 0 jackxiang.com:8015 *:* LISTEN
tcp 0 0 *:sunrpc *:* LISTEN
tcp 0 0 *:http *:* LISTEN
tcp 0 0 jackxiang.com:x11 *:* LISTEN
tcp 0 0 jackxiang.com:cddbp-alt *:* LISTEN
tcp 0 0 jackxiang.com:8017 *:* LISTEN
tcp 0 0 *:6001 *:* LISTEN
tcp 0 0 *:ssh *:* LISTEN
tcp 0 0 jackxiang.com:socks *:* LISTEN
tcp 0 0 localhost:smtp *:* LISTEN
tcp 0 0 *:https *:* LISTEN
tcp 0 0 *:34139 *:* LISTEN
tcp 0 0 jackxiang.com:irdmi *:* LISTEN
tcp 0 0 jackxiang.com:mcreport *:* LISTEN
tcp 0 0 jackxiang.com:8006 *:* LISTEN
tcp 0 0 jackxiang.com:cslistener *:* LISTEN
tcp 0 0 jackxiang.com:8009 *:* LISTEN
tcp 0 0 jackxiang.com:etlservicemgr *:* LISTEN
tcp 0 0 jackxiang.com:8010 *:* LISTEN
tcp 0 0 *:sunrpc *:* LISTEN
tcp 0 0 *:webcache *:* LISTEN
tcp 0 0 *:6001 *:* LISTEN
tcp 0 0 *:ssh *:* LISTEN
tcp 0 0 *:60763 *:* LISTEN
我做了一个实验,如果是 keepalive 的情况,默认浏览器不关闭,连接就不断开
即使你不再有任何页面的访问操作,连接也一直保持,直到浏览器关闭为止
因此,初步判断,你的 ESTABLISHED 过多的原因是大多数人不关闭浏览器造成的,你自己也可以试验一下
如果想缩短这个,可以修改 webserver 的配置
因为现在的浏览器都是支持keepalive并遵守服务器配置,我试验了也是这样的
要把整个浏览器关了才会没有ESTABLISHED ,楼上的请问下在nginx上怎么主动断开,可以试验下看性能和速度方面会不会有影响
以上讨论来自:
http://bbs.chinaunix.net/thread-1945952-2-1.html
————————————————————————————————————————————————————————————————
导致服务器load过高
send_timeout
syntax: send_timeout the time
default: send_timeout 60
context: http, server, location
Directive assigns response timeout to client. Timeout is established not on entire transfer of answer, but only between two operations of reading, if after this time client will take nothing, then nginx is shutting down the connection.
应该是tcp连接没有释放造成的,我最近也碰到这个问题
其中的SYN_RECV表示正在等待处理的请求数;ESTABLISHED表示正常数据传输状态;TIME_WAIT表示处理完毕,等待超时结束的请求数。
具体如下:
状态:描述
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉
Tcp图解:
获取Windows下的Established的bat自动脚本备案,指定进程的网络连接状态为established的连接数:
文库:http://wenku.baidu.com/link?url=NJKFU95Elz0RjW6MV99qhoVdcSz7OLxvOoPhdnoOMGb_mKMUVysGxc8GhqSXG7pwuyY5fuNQEW2iyQGzT1DzraPI6kv3l4RzVvszkn3SUl3
近日,互联网有消息透露称微软Skype宣布正在测试一个基于Web端的即时通讯平台,也就是说Web版的Skype很可能将很快和大家见面。
按照Skype的说法,有了这个基于Web端的Skype即时通讯平台,接下来用户们将可以直接在浏览器中使用Skype的音视频服务,将会支持IE、Chrome、Firefox、Safari等浏览器。
Skype宣布正测试基于Web端的即时通讯平台_天极yesky软件频道
据悉,Skype for Web采用WebRTC技术,是一套基于浏览器的音频和视频标准,该标准将不需要用户安装本地软件。
因为目前处于Beta阶段,故仅有小部分用户可以体验到,并且还存在许多Bug,正式版将会在接下来几个月发布。
按照Skype的说法,有了这个基于Web端的Skype即时通讯平台,接下来用户们将可以直接在浏览器中使用Skype的音视频服务,将会支持IE、Chrome、Firefox、Safari等浏览器。
Skype宣布正测试基于Web端的即时通讯平台_天极yesky软件频道
据悉,Skype for Web采用WebRTC技术,是一套基于浏览器的音频和视频标准,该标准将不需要用户安装本地软件。
因为目前处于Beta阶段,故仅有小部分用户可以体验到,并且还存在许多Bug,正式版将会在接下来几个月发布。
背景:chrome速度快,版本更新后,我们认为速度更快,现在都到44.0.2369.0了,链接在,http://down.tech.sina.com.cn/page/40975.html
Google浏览器Chrome稳定版近日发布例行小幅更新,新版本号为v40.0.2214.94,本次更新为V40的第三次维护,修补安全漏洞并消除bug,改进了更新消息提示窗,在提示出错信息后给予全新计时机制。
Chrome v40.0.2214.94浏览器稳定版更新_天极yesky软件频道
Chrome v40.0.2214.94浏览器稳定版更新
Google Chrome 40.0 更新内容如下:
在Windows和Linux平台上新的Chrome应用更新对话框。
此更新包括62个安全修补程序。包括:ICU、V8引擎、字体中的内存损坏问题,Use-after-free在IndexedDB、WebAudio、DOM、FFmpeg、Speech、Views中的问题,Same-origin-bypass在V8引擎中的问题,ICU、字体未初始化值的问题,UI、Skia、PDFium、字体越界读取问题,AppCache的缓存错误问题等。
64位Chrome能更好地利用当今的硬件,并且对速度、安全性、稳定性进行了改善,主要特性如下:
速度:64位Chrome能利用最新的处理器和编译器优化、更现代的指令集、更快的调用协议,从而实现了速度大提升,尤其是在图形和多媒体内容方面,性能提升25%。
安全性:Chrome能够利用最新的OS功能,例如Windows 8的High Entropy ASLR,64位Chrome在安全性上也实现了大幅提升。
稳定性:Google还在32位Chrome的基础上增强了64位Chrome的稳定性,尤其是,渲染器处理中的崩溃率大大降低,是32位Chrome的一半。
官方下载:
34位版本 Chrome v40.0.2214.94
如果出现升级失败,看下Google Chrome浏览器提示管理员已停用更新的解决方法:
Google Chrome浏览器提示管理员已停用更新的解决方法
最近发现Google Chrome不能自动更新,打开设置的关于Google Chrome看到如下图的提示,
要解决该问题,需要修改注册表的值,打开运行窗口(快捷键Win+R)输入regedit并回车,
在注册表窗口中依次导航到
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Update
找到该项下面的UpdateDefault,将其值修改为1。
Google浏览器Chrome稳定版近日发布例行小幅更新,新版本号为v40.0.2214.94,本次更新为V40的第三次维护,修补安全漏洞并消除bug,改进了更新消息提示窗,在提示出错信息后给予全新计时机制。
Chrome v40.0.2214.94浏览器稳定版更新_天极yesky软件频道
Chrome v40.0.2214.94浏览器稳定版更新
Google Chrome 40.0 更新内容如下:
在Windows和Linux平台上新的Chrome应用更新对话框。
此更新包括62个安全修补程序。包括:ICU、V8引擎、字体中的内存损坏问题,Use-after-free在IndexedDB、WebAudio、DOM、FFmpeg、Speech、Views中的问题,Same-origin-bypass在V8引擎中的问题,ICU、字体未初始化值的问题,UI、Skia、PDFium、字体越界读取问题,AppCache的缓存错误问题等。
64位Chrome能更好地利用当今的硬件,并且对速度、安全性、稳定性进行了改善,主要特性如下:
速度:64位Chrome能利用最新的处理器和编译器优化、更现代的指令集、更快的调用协议,从而实现了速度大提升,尤其是在图形和多媒体内容方面,性能提升25%。
安全性:Chrome能够利用最新的OS功能,例如Windows 8的High Entropy ASLR,64位Chrome在安全性上也实现了大幅提升。
稳定性:Google还在32位Chrome的基础上增强了64位Chrome的稳定性,尤其是,渲染器处理中的崩溃率大大降低,是32位Chrome的一半。
官方下载:
34位版本 Chrome v40.0.2214.94
如果出现升级失败,看下Google Chrome浏览器提示管理员已停用更新的解决方法:
Google Chrome浏览器提示管理员已停用更新的解决方法
最近发现Google Chrome不能自动更新,打开设置的关于Google Chrome看到如下图的提示,
要解决该问题,需要修改注册表的值,打开运行窗口(快捷键Win+R)输入regedit并回车,
在注册表窗口中依次导航到
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Update
找到该项下面的UpdateDefault,将其值修改为1。
背景:能用web引擎支持不用web浏览器,更精减,能用开源不用闭源,这儿就有一个开源的web 引擎,并支持WEBRtc ,链接:https://crosswalk-project.org/documentation/webrtc.html ,第二:微软从IE转向Spartan浏览器开发 http://tools.yesky.com/331/50546831.shtml ,微软新浏览器“Spartan”界面截图再曝光,解决兼容性问题:http://soft.yesky.com/52/50685552.shtml ,表明微软正在发力网络用户及界面展现端。
阅读全文

背景:天气变化太快,感冒了要是流鼻涕,那真是最痛苦的事了,不管大人孩子,鼻子都被擦的红红的,整天吸溜鼻子。在这里教大家几个方法,可以快速止鼻涕的。
一)如果你自己没法判断是风热还是风寒感冒,那就买一盒西药的感冒药吃了吧,可以止鼻涕,治鼻塞的。
二)或者拿热气熏鼻子,让鼻涕液化大量快速的流出,这样做过之后鼻涕就少了。
三)可以拿电吹风吹背部大椎穴和肺俞穴吹10分钟,这样鼻涕也可以很快止住,对于治疗初期感冒也是立竿见影。
阅读全文
一)如果你自己没法判断是风热还是风寒感冒,那就买一盒西药的感冒药吃了吧,可以止鼻涕,治鼻塞的。
二)或者拿热气熏鼻子,让鼻涕液化大量快速的流出,这样做过之后鼻涕就少了。
三)可以拿电吹风吹背部大椎穴和肺俞穴吹10分钟,这样鼻涕也可以很快止住,对于治疗初期感冒也是立竿见影。

warning:deprecated conversion from string constant to 'char *' 解决方案
Unix/LinuxC技术 jackx 2015-2-16 17:00
背景:用新版本的编译器编译时,原来没有报任何错和警告的代码,现在居然报出警告了,
之前是:
无错误,现在是新的gcc v4.4的编译器编译时候出现警告了,如下:
警告如下:
multipepollserver.cpp:530: warning: deprecated conversion from string constant to ‘char*’
multipepollserver.cpp:536: warning: deprecated conversion from string constant to ‘char*’
multipepollserver.cpp:537: warning: deprecated conversion from string constant to ‘char*’
原来是定义pid变量时,新的gcc版本需要加上const,也就是:
为何要加,下面文章有描写道:
阅读全文
之前是:
无错误,现在是新的gcc v4.4的编译器编译时候出现警告了,如下:
警告如下:
multipepollserver.cpp:530: warning: deprecated conversion from string constant to ‘char*’
multipepollserver.cpp:536: warning: deprecated conversion from string constant to ‘char*’
multipepollserver.cpp:537: warning: deprecated conversion from string constant to ‘char*’
原来是定义pid变量时,新的gcc版本需要加上const,也就是:
为何要加,下面文章有描写道:

[实践OK]libmemcached使用(c 客户端连接 memcached),封装 libmemcached 构建 memcached 客户端。
Cache与Store jackx 2015-2-15 17:05
背景:如果要用c写成一个服务部署4台机器,均得和memcached交互,还得用这个库,如PHP的扩展啥的没怎么和c的lib打交到,这下实践一下挺好的,过程比较曲折但是也发现了这memcached用新的gcc还是对配置上有一些影响的,就单说配置这块的门槛就变高了,更别说c下的调试啥的,实践起来仅仅通过网上的一篇文章未必能搞定。
libmemcached是C客户端到memcached服 务器的接口库。具有低内存占用率、线程安全、并提供对memcached功能的全面支持。它还采用多种命令行工具,包括: memcat、memflush、memrm、memstat、memslap。
在Ubuntu上安装memcached和libmemcached http://www.linuxidc.com/Linux/2010-04/25543.htm
libmemcached C/C++ API使用实例 http://www.linuxidc.com/Linux/2012-01/52516.htm
memcached简单的使用教程(转载): http://blog.csdn.net/huangqiwa/article/details/21174425
使用连接池访问memcached(libmemcached)的完整例子:http://blog.csdn.net/hzhxxx/article/details/41961355
(1)封装 libmemcached 构建 memcached 客户端:http://blog.csdn.net/yanghw0510/article/details/7292236
(2)libmemcached使用(c 客户端连接 memcached) :
(3)libmemcached 下载地址。https://launchpad.net/libmemcached/
1、下载安装libmemcached
$ wget http://launchpad.net/libmemcached/1.0/0.44/+download/libmemcached-0.44.tar.gz
$ tar xvzf libmemcached-0.44tar.gz
$ cd libmemcached-0.44
$ ./configure
$ make
$ sudo make install
libmemcached 默认安装在/usr/local/,头文件安装在/usr/local/include/libmemcachde/,动态库默认安装在/usr/local/lib/下。
我在这儿下的:https://launchpadlibrarian.net/165454254/libmemcached-1.0.18.tar.gz
注:
如果报”./libmemcached-1.0/memcached.h:46:27: error: tr1/cinttypes: No such file or directory”错误,则需要升级gcc版本.
处理如下:
yum install gcc44 gcc44-c++ libstdc++44-devel
export CC=/usr/bin/gcc44
export CXX=/usr/bin/g++44
重新编译安装libmemcached-1.0.9
关键信息:error: tr1/cinttypes: No such file or directory
报错原因:libmemcached需要 gcc 4.2 以上版本才可编译,而centos 5.4 的gcc版本只有4.1 ,详见:https://bugs.launchpad.net/libmemcached/+bug/1076181
解决方法:安装gcc44的扩展包,详见:http://gearman.info/build/centos5-8.html
export就是在于此,把这个gcc和g++的版本号给提上去,以方便这个memcached的编译:
/usr/bin/gcc44 -v
gcc version 4.4.7 20120313 (Red Hat 4.4.7-1) (GCC)
gcc -v
gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)
/usr/bin/g++44 -v
gcc version 4.4.7 20120313 (Red Hat 4.4.7-1) (GCC)
g++ -v
gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)
——————————————————————————————————————————————————————————
这个问题在安gearman时也遇到过,升级gcc,参考连接: http://jackxiang.com/post/7693/ ,软链接如下所示:
export CC=/usr/bin/gcc44 or export CC=/usr/bin/gcc
export CXX=/usr/bin/g++44
./configure && make && make install
./configure && make && make install
/usr/bin/install -c -m 644 support/libmemcached.pc '/usr/local/lib/pkgconfig'
make[2]: Leaving directory `/tmp/testmemcachedcpp/libmemcached-1.0.18'
make[1]: Leaving directory `/tmp/testmemcachedcpp/libmemcached-1.0.18'
g++ -o testmemcached testmemcached.cpp -lmemcached
In file included from /usr/local/include/libmemcached/memcached.h:39,
from testmemcached.cpp:6:
/usr/local/include/libmemcached-1.0/memcached.h:46:23: error: cinttypes: No such file or directory
明天再整下,估计是so没有给ldd进来...
2、libmemcached简单测试使用
编译:g++ -o testmemcached testmemcached.cpp -lmemcached
运行:./testmemcached
结果:Save data:value sucessful!
Get value:value sucessful!
Delete key:key sucessful!
实践编译一下:
g++ -o testmemcached testmemcached.cpp -lmemcached
In file included from /usr/local/include/libmemcached/memcached.h:39,
from testmemcached.cpp:6:
/usr/local/include/libmemcached-1.0/memcached.h:46:23: error: cinttypes: No such file or directory
看来还得重新export一次新的编译器,因为昨天的关了终端,今天的又没了:
export CC=/usr/bin/gcc44 or export CC=/usr/bin/gcc //这行有问题~
export CXX=/usr/bin/g++44
g++ -o testmemcached testmemcached.cpp -lmemcached
为何还是不行?
echo $CC
/usr/bin/gcc //没变,这儿有问题,再重新设置一次,查到上面这个or有问题:export CC=/usr/bin/gcc44。
# echo $CXX
/usr/bin/g++44 //变了
重新设置,好了:
export CC=/usr/bin/gcc44
/usr/bin/gcc44
继续折腾,/usr/bin/gcc44 -o testmemcached testmemcached.cpp -lmemcached
In file included from /usr/lib/gcc/x86_64-redhat-linux6E/4.4.7/../../../../include/c++/4.4.7/cinttypes:35,
from /usr/local/include/libmemcached-1.0/memcached.h:46,
from /usr/local/include/libmemcached/memcached.h:39,
from testmemcached.cpp:6:
/usr/lib/gcc/x86_64-redhat-linux6E/4.4.7/../../../../include/c++/4.4.7/c++0x_warning.h:31:2: error: #error This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. This support is currently experimental, and must be enabled with the -std=c++0x or -std=gnu++0x compiler options.
#error This file requires compiler and library support for the upcoming ISO C++ standard, C++0x.
加上:-lpthread -std=c++0x ,解决如下:
g++ -o testmemcached testmemcached.cpp -lmemcached -lpthread -std=c++0x
/usr/bin/ld: cannot find -lmemcached
collect2: ld returned 1 exit status
也就是说编译器并不能从ldconfig 里得知,其lib在哪儿(及时把Lib路径加入到/etc/ld.so.conf.d/libmemcache.conf),得指定:
在网上找了一下,发现是这样的:http://blog.163.com/guixl_001/blog/static/4176410420121021111117987/ 里说得加一个新的参数,是和宏相关,那就加了,
指定一个新的参数:-std=c++0x :
/usr/bin/gcc44 -o testmemcached testmemcached.cpp -lmemcached -std=c++0x
/usr/local/lib/libmemcached.so: undefined reference to `pthread_once'
collect2: ld returned 1 exit status
/usr/bin/g++44 -o testmemcached testmemcached.cpp -lmemcached -std=c++0x
/usr/local/lib/libmemcached.so: undefined reference to `pthread_once'
怎样彻底解决"undefined reference to `pthread_create'"问题 ,说是加个: -lrt ,这一看就是那个memcached的库包含了这个文件:#include<pthread.h>
来源参考:
http://bbs.chinaunix.net/thread-1586752-1-1.html
于是Ok啦,最终O了,如下:
[root@test testmemcachedcpp]# /usr/bin/g++44 -o testmemcached testmemcached.cpp -lmemcached -lrt -std=c++0x
[root@test testmemcachedcpp]#
运行一下试试:
[root@test testmemcachedcpp]# ./testmemcached
./testmemcached: error while loading shared libraries: libmemcached.so.11: cannot open shared object file: No such file or directory
[root@test /]# find . -name "libmemcached.so.11"
./usr/local/lib/libmemcached.so.11
打开配置文件 vi /etc/ld.so.conf
加上一行:/usr/local/lib
执行/sbin/ldconfig /etc/ld.so.conf
[root@test testmemcachedcpp]# /sbin/ldconfig /etc/ld.so.conf
[root@test testmemcachedcpp]# ./testmemcached
[root@test testmemcachedcpp]#
没报错了~,用gdb看一下 加个-g参数:
/usr/bin/g++44 -g -o testmemcached testmemcached.cpp -lmemcached -lrt -std=c++0x
发现localhost没有开11211,于是找了一台机器把ip和端口写上,重新编译一次后运行Ok,如下:
[root@test testmemcachedcpp]# ./testmemcached
Save data:value sucessful!
Get value:value sucessful!
少了一个删除成功的,简单调试一下:
(gdb) n
Get value:value sucessful!
50 rc=memcached_delete(memc,key.c_str(),key_length,expiration);
(gdb) p key.c_str()
$5 = 0x184372e8 "key"
(gdb) p key_length
$6 = 3
(gdb) n
51 if(rc==MEMCACHED_SUCCESS)
(gdb) p rc
$3 = MEMCACHED_INVALID_ARGUMENTS
也就是调这个函数的参数不对,返回不是MEMCACHED_SUCCESS,所以没有打印出:cout<<"Delete key:"<<key<<" sucessful!"<<endl;
####################新的代码里grep了一下该方法###########################
./tests/mem_udp.cc: memcached_delete(memc, test_literal_param("foo"), 0));
./libmemcached-1.0/memcached.hpp: return memcached_success(memcached_delete(memc_, key.c_str(), key.length(), 0));
./libmemcached-1.0/memcached.hpp: return memcached_success(memcached_delete(memc_,
./tests/libmemcached-1.0/replication.cc: memcached_return_t del_rc= memcached_delete(memc_replicated,
./tests/libmemcached-1.0/mem_functions.cc: rc= memcached_delete(memc, "foo", 3, 1);
./tests/libmemcached-1.0/mem_functions.cc: test_compare(MEMCACHED_BUFFERED, (rc= memcached_delete(memc, "foo", 3, 0)));
./tests/libmemcached-1.0/mem_functions.cc: test_compare(MEMCACHED_SUCCESS, memcached_delete(memc, "foo", 3, 0));
./tests/libmemcached-1.0/mem_functions.cc: test_compare(MEMCACHED_NOTFOUND, memcached_delete(memc, "foo", 3, 0));
####################################################################
于是修改为下面这样:
//rc=memcached_delete(memc,key.c_str(),key_length,expiration);
rc=memcached_delete(memc,key.c_str(),key_length,0);
./testmemcached
Save data:value2 sucessful!
Get value:value2 sucessful!
Delete key:key sucessful!
刚才失败时有值,现在运行后没值了,给成功删除了:
[root@localhost ~]# telnet 192.168.108.7 11211
Escape character is '^]'.
get key
VALUE key 0 5
value
END
get key
END
后面怎么结合c的socket 及epoll进行进程/线程调试就不再细说了,我也在摸索中,应该也有相关的调试办法,但这儿说明这个memcached搞个新的gcc版本库才能编译确实带了相当多编译及配置上的的麻烦~
最后,用C函数里的add函数实现类php的memcache的扩展的原子操作函数,如下:
原子操作方法,假如有add后就不能再add,必须删除后才能add,这个可以用作锁:
./libmemcached-1.0.18/libmemcached-1.0/memcached.hpp:
和php的add函数一样第一次运行时没有问题此时值设置成功,再运行add时一次就add不进去,add设置进去后,用set是能重新设置进去的,只是用add原子操作是不行的,用它来做锁很好使:
1)代码片段:
2)运行情况:
[root@test testmemcachedcpp]# gdb testmemcached
b 41
r
Add data:value unsucessful,Perhaps add key before set !
(gdb) p rc
$2 = MEMCACHED_NOTSTORED
但是能够set进去:
42 rc=memcached_set(memc,key.c_str(),key.length(),value.c_str(),value.length(),expiration,flags);
(gdb) n
43 if(rc==MEMCACHED_SUCCESS)
(gdb) p rc
$3 = MEMCACHED_SUCCESS
EOF
对add后的键对应的值,再用set方法是可以设置的,如下:
string key = "key2";
string value = "jackxiang";
rc=memcached_add(memc,key.c_str(),key.length(),value.c_str(),value.length(),expiration,flags);
后再修改这个值:
value = "xiangdong";
rc=memcached_set(memc,key.c_str(),key.length(),value.c_str(),value.length(),expiration,flags);
用gdb的断点跟踪一下并用telnet在设置后查看,如下:
[root@localhost ~]# telnet 192.168.108.7 11211
Escape character is '^]'.
get key2
END
get key2
VALUE key2 0 9
jackxiang
END
get key2
VALUE key2 0 9
xiangdong
END
听说,在下载客户端libmemcached-1.0.18/tests 下有测试列子,也可参考。比如cpp_example.cc
ls ~+/cpp_example.cc
/tmp/testmemcachedcpp/libmemcached-1.0.18/tests/cpp_example.cc
摘自:http://www.cppblog.com/kefeng/archive/2010/10/11/129422.html
http://blog.chinaunix.net/uid-52437-id-2108905.html
后发现这个哥们写的文章很详细,http://blog.chinaunix.net/uid-20548989-id-1667248.html
加入add后,rc=MEMCACHED_NOTSTORED情况,代码贴下面:
libmemcached是C客户端到memcached服 务器的接口库。具有低内存占用率、线程安全、并提供对memcached功能的全面支持。它还采用多种命令行工具,包括: memcat、memflush、memrm、memstat、memslap。
在Ubuntu上安装memcached和libmemcached http://www.linuxidc.com/Linux/2010-04/25543.htm
libmemcached C/C++ API使用实例 http://www.linuxidc.com/Linux/2012-01/52516.htm
memcached简单的使用教程(转载): http://blog.csdn.net/huangqiwa/article/details/21174425
使用连接池访问memcached(libmemcached)的完整例子:http://blog.csdn.net/hzhxxx/article/details/41961355
(1)封装 libmemcached 构建 memcached 客户端:http://blog.csdn.net/yanghw0510/article/details/7292236
(2)libmemcached使用(c 客户端连接 memcached) :
(3)libmemcached 下载地址。https://launchpad.net/libmemcached/
1、下载安装libmemcached
$ wget http://launchpad.net/libmemcached/1.0/0.44/+download/libmemcached-0.44.tar.gz
$ tar xvzf libmemcached-0.44tar.gz
$ cd libmemcached-0.44
$ ./configure
$ make
$ sudo make install
libmemcached 默认安装在/usr/local/,头文件安装在/usr/local/include/libmemcachde/,动态库默认安装在/usr/local/lib/下。
我在这儿下的:https://launchpadlibrarian.net/165454254/libmemcached-1.0.18.tar.gz
注:
如果报”./libmemcached-1.0/memcached.h:46:27: error: tr1/cinttypes: No such file or directory”错误,则需要升级gcc版本.
处理如下:
yum install gcc44 gcc44-c++ libstdc++44-devel
export CC=/usr/bin/gcc44
export CXX=/usr/bin/g++44
重新编译安装libmemcached-1.0.9
关键信息:error: tr1/cinttypes: No such file or directory
报错原因:libmemcached需要 gcc 4.2 以上版本才可编译,而centos 5.4 的gcc版本只有4.1 ,详见:https://bugs.launchpad.net/libmemcached/+bug/1076181
解决方法:安装gcc44的扩展包,详见:http://gearman.info/build/centos5-8.html
export就是在于此,把这个gcc和g++的版本号给提上去,以方便这个memcached的编译:
/usr/bin/gcc44 -v
gcc version 4.4.7 20120313 (Red Hat 4.4.7-1) (GCC)
gcc -v
gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)
/usr/bin/g++44 -v
gcc version 4.4.7 20120313 (Red Hat 4.4.7-1) (GCC)
g++ -v
gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)
——————————————————————————————————————————————————————————
这个问题在安gearman时也遇到过,升级gcc,参考连接: http://jackxiang.com/post/7693/ ,软链接如下所示:
export CC=/usr/bin/gcc44 or export CC=/usr/bin/gcc
export CXX=/usr/bin/g++44
./configure && make && make install
./configure && make && make install
/usr/bin/install -c -m 644 support/libmemcached.pc '/usr/local/lib/pkgconfig'
make[2]: Leaving directory `/tmp/testmemcachedcpp/libmemcached-1.0.18'
make[1]: Leaving directory `/tmp/testmemcachedcpp/libmemcached-1.0.18'
g++ -o testmemcached testmemcached.cpp -lmemcached
In file included from /usr/local/include/libmemcached/memcached.h:39,
from testmemcached.cpp:6:
/usr/local/include/libmemcached-1.0/memcached.h:46:23: error: cinttypes: No such file or directory
明天再整下,估计是so没有给ldd进来...
2、libmemcached简单测试使用
编译:g++ -o testmemcached testmemcached.cpp -lmemcached
运行:./testmemcached
结果:Save data:value sucessful!
Get value:value sucessful!
Delete key:key sucessful!
实践编译一下:
g++ -o testmemcached testmemcached.cpp -lmemcached
In file included from /usr/local/include/libmemcached/memcached.h:39,
from testmemcached.cpp:6:
/usr/local/include/libmemcached-1.0/memcached.h:46:23: error: cinttypes: No such file or directory
看来还得重新export一次新的编译器,因为昨天的关了终端,今天的又没了:
export CC=/usr/bin/gcc44 or export CC=/usr/bin/gcc //这行有问题~
export CXX=/usr/bin/g++44
g++ -o testmemcached testmemcached.cpp -lmemcached
为何还是不行?
echo $CC
/usr/bin/gcc //没变,这儿有问题,再重新设置一次,查到上面这个or有问题:export CC=/usr/bin/gcc44。
# echo $CXX
/usr/bin/g++44 //变了
重新设置,好了:
export CC=/usr/bin/gcc44
/usr/bin/gcc44
继续折腾,/usr/bin/gcc44 -o testmemcached testmemcached.cpp -lmemcached
In file included from /usr/lib/gcc/x86_64-redhat-linux6E/4.4.7/../../../../include/c++/4.4.7/cinttypes:35,
from /usr/local/include/libmemcached-1.0/memcached.h:46,
from /usr/local/include/libmemcached/memcached.h:39,
from testmemcached.cpp:6:
/usr/lib/gcc/x86_64-redhat-linux6E/4.4.7/../../../../include/c++/4.4.7/c++0x_warning.h:31:2: error: #error This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. This support is currently experimental, and must be enabled with the -std=c++0x or -std=gnu++0x compiler options.
#error This file requires compiler and library support for the upcoming ISO C++ standard, C++0x.
加上:-lpthread -std=c++0x ,解决如下:
g++ -o testmemcached testmemcached.cpp -lmemcached -lpthread -std=c++0x
/usr/bin/ld: cannot find -lmemcached
collect2: ld returned 1 exit status
也就是说编译器并不能从ldconfig 里得知,其lib在哪儿(及时把Lib路径加入到/etc/ld.so.conf.d/libmemcache.conf),得指定:
在网上找了一下,发现是这样的:http://blog.163.com/guixl_001/blog/static/4176410420121021111117987/ 里说得加一个新的参数,是和宏相关,那就加了,
指定一个新的参数:-std=c++0x :
/usr/bin/gcc44 -o testmemcached testmemcached.cpp -lmemcached -std=c++0x
/usr/local/lib/libmemcached.so: undefined reference to `pthread_once'
collect2: ld returned 1 exit status
/usr/bin/g++44 -o testmemcached testmemcached.cpp -lmemcached -std=c++0x
/usr/local/lib/libmemcached.so: undefined reference to `pthread_once'
怎样彻底解决"undefined reference to `pthread_create'"问题 ,说是加个: -lrt ,这一看就是那个memcached的库包含了这个文件:#include<pthread.h>
来源参考:
http://bbs.chinaunix.net/thread-1586752-1-1.html
于是Ok啦,最终O了,如下:
[root@test testmemcachedcpp]# /usr/bin/g++44 -o testmemcached testmemcached.cpp -lmemcached -lrt -std=c++0x
[root@test testmemcachedcpp]#
运行一下试试:
[root@test testmemcachedcpp]# ./testmemcached
./testmemcached: error while loading shared libraries: libmemcached.so.11: cannot open shared object file: No such file or directory
[root@test /]# find . -name "libmemcached.so.11"
./usr/local/lib/libmemcached.so.11
打开配置文件 vi /etc/ld.so.conf
加上一行:/usr/local/lib
执行/sbin/ldconfig /etc/ld.so.conf
[root@test testmemcachedcpp]# /sbin/ldconfig /etc/ld.so.conf
[root@test testmemcachedcpp]# ./testmemcached
[root@test testmemcachedcpp]#
没报错了~,用gdb看一下 加个-g参数:
/usr/bin/g++44 -g -o testmemcached testmemcached.cpp -lmemcached -lrt -std=c++0x
发现localhost没有开11211,于是找了一台机器把ip和端口写上,重新编译一次后运行Ok,如下:
[root@test testmemcachedcpp]# ./testmemcached
Save data:value sucessful!
Get value:value sucessful!
少了一个删除成功的,简单调试一下:
(gdb) n
Get value:value sucessful!
50 rc=memcached_delete(memc,key.c_str(),key_length,expiration);
(gdb) p key.c_str()
$5 = 0x184372e8 "key"
(gdb) p key_length
$6 = 3
(gdb) n
51 if(rc==MEMCACHED_SUCCESS)
(gdb) p rc
$3 = MEMCACHED_INVALID_ARGUMENTS
也就是调这个函数的参数不对,返回不是MEMCACHED_SUCCESS,所以没有打印出:cout<<"Delete key:"<<key<<" sucessful!"<<endl;
####################新的代码里grep了一下该方法###########################
./tests/mem_udp.cc: memcached_delete(memc, test_literal_param("foo"), 0));
./libmemcached-1.0/memcached.hpp: return memcached_success(memcached_delete(memc_, key.c_str(), key.length(), 0));
./libmemcached-1.0/memcached.hpp: return memcached_success(memcached_delete(memc_,
./tests/libmemcached-1.0/replication.cc: memcached_return_t del_rc= memcached_delete(memc_replicated,
./tests/libmemcached-1.0/mem_functions.cc: rc= memcached_delete(memc, "foo", 3, 1);
./tests/libmemcached-1.0/mem_functions.cc: test_compare(MEMCACHED_BUFFERED, (rc= memcached_delete(memc, "foo", 3, 0)));
./tests/libmemcached-1.0/mem_functions.cc: test_compare(MEMCACHED_SUCCESS, memcached_delete(memc, "foo", 3, 0));
./tests/libmemcached-1.0/mem_functions.cc: test_compare(MEMCACHED_NOTFOUND, memcached_delete(memc, "foo", 3, 0));
####################################################################
于是修改为下面这样:
//rc=memcached_delete(memc,key.c_str(),key_length,expiration);
rc=memcached_delete(memc,key.c_str(),key_length,0);
./testmemcached
Save data:value2 sucessful!
Get value:value2 sucessful!
Delete key:key sucessful!
刚才失败时有值,现在运行后没值了,给成功删除了:
[root@localhost ~]# telnet 192.168.108.7 11211
Escape character is '^]'.
get key
VALUE key 0 5
value
END
get key
END
后面怎么结合c的socket 及epoll进行进程/线程调试就不再细说了,我也在摸索中,应该也有相关的调试办法,但这儿说明这个memcached搞个新的gcc版本库才能编译确实带了相当多编译及配置上的的麻烦~
最后,用C函数里的add函数实现类php的memcache的扩展的原子操作函数,如下:
原子操作方法,假如有add后就不能再add,必须删除后才能add,这个可以用作锁:
./libmemcached-1.0.18/libmemcached-1.0/memcached.hpp:
和php的add函数一样第一次运行时没有问题此时值设置成功,再运行add时一次就add不进去,add设置进去后,用set是能重新设置进去的,只是用add原子操作是不行的,用它来做锁很好使:
1)代码片段:
2)运行情况:
[root@test testmemcachedcpp]# gdb testmemcached
b 41
r
Add data:value unsucessful,Perhaps add key before set !
(gdb) p rc
$2 = MEMCACHED_NOTSTORED
但是能够set进去:
42 rc=memcached_set(memc,key.c_str(),key.length(),value.c_str(),value.length(),expiration,flags);
(gdb) n
43 if(rc==MEMCACHED_SUCCESS)
(gdb) p rc
$3 = MEMCACHED_SUCCESS
EOF
对add后的键对应的值,再用set方法是可以设置的,如下:
string key = "key2";
string value = "jackxiang";
rc=memcached_add(memc,key.c_str(),key.length(),value.c_str(),value.length(),expiration,flags);
后再修改这个值:
value = "xiangdong";
rc=memcached_set(memc,key.c_str(),key.length(),value.c_str(),value.length(),expiration,flags);
用gdb的断点跟踪一下并用telnet在设置后查看,如下:
[root@localhost ~]# telnet 192.168.108.7 11211
Escape character is '^]'.
get key2
END
get key2
VALUE key2 0 9
jackxiang
END
get key2
VALUE key2 0 9
xiangdong
END
听说,在下载客户端libmemcached-1.0.18/tests 下有测试列子,也可参考。比如cpp_example.cc
ls ~+/cpp_example.cc
/tmp/testmemcachedcpp/libmemcached-1.0.18/tests/cpp_example.cc
摘自:http://www.cppblog.com/kefeng/archive/2010/10/11/129422.html
http://blog.chinaunix.net/uid-52437-id-2108905.html
后发现这个哥们写的文章很详细,http://blog.chinaunix.net/uid-20548989-id-1667248.html
加入add后,rc=MEMCACHED_NOTSTORED情况,代码贴下面:
CentOS 7 使用经验分享,CentOS 7 修改开机顺序,CentOS7 采用的是systemd,centos7上systemd详解。
Unix/LinuxC技术 jackx 2015-2-9 09:17
一、记录CentOS 7与以往不同的地方
由于公司这一期的产品准备支持的环境有CentOS 7、MySql 5.6、Java 8、Tomcat 8等等,并且因为人员严重不足,我本月的开发任务在原有的基础上又加上了好多环境检证的工作。
因为在这次环境检证过程中遇到了不少困难,特此记录一下。
重点:记录CentOS 7与以往不同的地方
1.取消ifconfig,使用ip addr 查看IP地址。
2.使用firewalld 取代 iptables。
3.系统默认编码设置文件,由/etc/sysconfig/i18n 更改为 /etc/locale.conf
___________________________详细介绍使用感受__________________________
因为系统安装时网络连接设置的自动获取,先改成静态ip。配置方法如下:
第一步,vi /etc/sysconfig/network-scripts/ifcfg-enp0s25;
设置内容:
解释:
IPADDR0 --> ip
GATEWAY0 --> 网关
DNS1 -->DNS
第二步,重启网络服务 -->service network restart(特别重要,千万不要忘记。)
第三步.查看ip ip addr,再 ping 一下网络。这是网络配置基本就完成了。
事情进展到这里貌似也没什么难过的坎,我开始配置防火墙。先使用 iptables status 查看防火墙状态,
我去,什么鬼?我敲错了?有一次仔细核对了每一个字母,完全没错啊!!!不管怎么说,先看一下iptables脚本是否还存在吧。
咦,iptables脚本不见了。不用多想一定是CentOS 7使用了新型的防火墙,立即百度。
※度娘解惑:CentOS 7使用firewalld 取代 iptables。使用命令行工具firewalld-cmd获取firewalld状态,$ firwall-cmd --state。
摘自:http://www.linuxidc.com/Linux/2015-01/111998.htm
————————————————————————————————————————————————————————————
二、修改开机启动顺序:
http://wenku.baidu.com/link?url=HXBiVyBOB_p1oAEN0Wunreof9Fff9dy4s6abRC_Zqq6Cm1ZbOvmgXrcQ3kC3OTLmDq-FwrjeK-Fw9zgoZ3yBGGyA_ikGSRtjvhjcS_dEaQu
————————————————————————————————————————————————————————————
三、 CentOS 7 巨大变动之 systemd 取代 SysV的Init
systemd是什么
首先systmed是一个用户空间的程序,属于应用程序,不属于Linux内核范畴,Linux内核的主要特征在所有发行版中是统一的,厂商可以自由改变的是用户空间的应用程序。
Linux内核加载启动后,用户空间的第一个进程就是初始化进程,这个程序的物理文件约定位于/sbin/init,当然也可以通过传递内核参数来让内核启动指定的程序。这个进程的特点是进程号为1,代表第一个运行的用户空间进程。不同发行版采用了不同的启动程序,主要有以下几种主流选择:
(1)以Ubuntu为代表的Linux发行版采用upstart。
(2)以7.0版本之前的CentOS为代表的System V init。
(3)CentOS7.0版本的systemd。
下面是CentOS6.5和CentOS7两个版本初始化进程的信息截图。
CentOS6.5采用的是systemV init
CentOS7 采用的是systemd:
Linux内核加载启动后,用户空间的第一个进程就是初始化进程,这个程序的物理文件约定位于/sbin/init,当然也可以通过传递内核参数来让内核启动指定的程序。这个进程的特点是进程号为1,代表第一个运行的用户空间进程。不同发行版采用了不同的启动程序,主要有以下几种主流选择:
(1)以Ubuntu为代表的Linux发行版采用upstart。
(2)以7.0版本之前的CentOS为代表的System V init。
(3)CentOS7.0版本的systemd。
下面是CentOS6.5和CentOS7两个版本初始化进程的信息截图。
CentOS6.5采用的是systemV init
CentOS7 采用的是systemd
摘自:http://blog.csdn.net/smstong/article/details/39317491
参考:https://blog.linuxeye.com/400.html
=======================centos7上systemd详解============================
CentOS 7继承了RHEL 7的新的特性,例如强大的systemd, 而systemd的使用也使得以往系统服务的/etc/init.d的启动脚本的方式就此改变, 也大幅提高了系统服务的运行效率。但服务的配置和以往也发生了极大的不同,同时变的简单而易用了许多。
CentOS 7的服务systemctl脚本存放在:/usr/lib/systemd/,有系统 system 和用户 user 之分, 即:/usr/lib/systemd/system 和 /usr/lib/systemd/user
配置文件
这里我们先要说明一下unit的文件位置,一般主要有三个目录:
/lib/systemd/system
/run/systemd/system
/etc/systemd/system
这三个目录的配置文件优先级依次从低到高,如果同一选项三个地方都配置了,优先级高的会覆盖优先级低的。 系统安装时,默认会将unit文件放在/lib/systemd/system目录。如果我们想要修改系统默认的配置,比如nginx.service,一般有两种方法:
在/etc/systemd/system目录下创建nginx.service文件,里面写上我们自己的配置。
在/etc/systemd/system下面创建nginx.service.d目录,在这个目录里面新建任何以.conf结尾的文件,然后写入我们自己的配置。推荐这种做法。
/run/systemd/system这个目录一般是进程在运行时动态创建unit文件的目录,一般很少修改,除非是修改程序运行时的一些参数时,即Session级别的,才在这里做修改。
服务配置
每一个服务以.service结尾,一般会分为3部分:[Unit]、[Service]和[Install],就以nginx为例吧,具体内容如下:
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
配置项说明
下面分别解释下着三部分的含义
[Unit]
Description : 服务的简单描述
Documentation : 服务文档
After= : 依赖,仅当依赖的服务启动之后再启动自定义的服务单元
[Service]
Type : 启动类型simple、forking、oneshot、notify、dbus
Type=simple(默认值):systemd认为该服务将立即启动,服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型
Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求, 使用此类型启动即可。使用此启动类型应同时指定PIDFile=,以便systemd能够跟踪服务的主进程。
Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。
Type=notify:与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号,这一通知的实现由 libsystemd-daemon.so 提供
Type=dbus:若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。
PIDFile : pid文件路径
ExecStartPre :启动前要做什么,上文中是测试配置文件 -t
ExecStart:启动
ExecReload:重载
ExecStop:停止
PrivateTmp:True表示给服务分配独立的临时空间
[Install]
WantedBy:服务安装的用户模式,从字面上看,就是想要使用这个服务的有是谁?上文中使用的是:multi-user.target ,就是指想要使用这个服务的目录是多用户。
每一个.target实际上是链接到我们单位文件的集合,当我们执行
systemctl enable nginx.service
就会在 /etc/systemd/system/multi-user.target.wants/ 目录下新建一个 /usr/lib/systemd/system/nginx.service 文件的链接。
systemctl status logstash.service
● logstash.service - logstash
Loaded: loaded (/etc/systemd/system/logstash.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2020-07-16 10:51:32 CST; 29min ago
systemctl is-enabled logstash.service
enabled
/etc/systemd/system/logstash.service
操作示例
下面是几个最常用的service操作:
# 自启动
systemctl enable nginx.service
# 禁止自启动
systemctl disable nginx.service
# 启动服务
systemctl start nginx.service
# 停止服务
systemctl stop nginx.service
# 重启服务
systemctl restart nginx.service
# 查看Unit定义文件
systemctl cat nginx.service
# 编辑Unit定义文件
systemctl edit nginx.service
# 重新加载Unit定义文件
systemctl reload nginx.service
# 列出已启动的所有unit,就是已经被加载到内存中
systemctl list-units
# 列出系统已经安装的所有unit,包括那些没有被加载到内存中的unit
systemctl list-unit-files
# 查看服务的日志
journalctl -u nginx.service # 还可以配合`-b`一起使用,只查看自本次系统启动以来的日志
# 查看所有target下的unit
systemctl list-unit-files --type=target
# 查看默认target,即默认的运行级别。对应于旧的`runlevel`命令
systemctl get-default
# 设置默认的target
systemctl set-default multi-user.target
# 查看某一target下的unit
systemctl list-dependencies multi-user.target
# 切换target,不属于新target的unit都会被停止
systemctl isolate multi-user.target
systemctl poweroff # 关机
systemctl reboot # 重启
systemctl rescue # 进入rescue模式
参考资料
create systemd unit files
NGINX systemd service file
Systemd introduction
From:https://www.xncoding.com/2016/06/07/linux/systemd.html
由于公司这一期的产品准备支持的环境有CentOS 7、MySql 5.6、Java 8、Tomcat 8等等,并且因为人员严重不足,我本月的开发任务在原有的基础上又加上了好多环境检证的工作。
因为在这次环境检证过程中遇到了不少困难,特此记录一下。
重点:记录CentOS 7与以往不同的地方
1.取消ifconfig,使用ip addr 查看IP地址。
2.使用firewalld 取代 iptables。
3.系统默认编码设置文件,由/etc/sysconfig/i18n 更改为 /etc/locale.conf
___________________________详细介绍使用感受__________________________
因为系统安装时网络连接设置的自动获取,先改成静态ip。配置方法如下:
第一步,vi /etc/sysconfig/network-scripts/ifcfg-enp0s25;
设置内容:
解释:
IPADDR0 --> ip
GATEWAY0 --> 网关
DNS1 -->DNS
第二步,重启网络服务 -->service network restart(特别重要,千万不要忘记。)
第三步.查看ip ip addr,再 ping 一下网络。这是网络配置基本就完成了。
事情进展到这里貌似也没什么难过的坎,我开始配置防火墙。先使用 iptables status 查看防火墙状态,
我去,什么鬼?我敲错了?有一次仔细核对了每一个字母,完全没错啊!!!不管怎么说,先看一下iptables脚本是否还存在吧。
咦,iptables脚本不见了。不用多想一定是CentOS 7使用了新型的防火墙,立即百度。
※度娘解惑:CentOS 7使用firewalld 取代 iptables。使用命令行工具firewalld-cmd获取firewalld状态,$ firwall-cmd --state。
摘自:http://www.linuxidc.com/Linux/2015-01/111998.htm
————————————————————————————————————————————————————————————
二、修改开机启动顺序:
http://wenku.baidu.com/link?url=HXBiVyBOB_p1oAEN0Wunreof9Fff9dy4s6abRC_Zqq6Cm1ZbOvmgXrcQ3kC3OTLmDq-FwrjeK-Fw9zgoZ3yBGGyA_ikGSRtjvhjcS_dEaQu
————————————————————————————————————————————————————————————
三、 CentOS 7 巨大变动之 systemd 取代 SysV的Init
systemd是什么
首先systmed是一个用户空间的程序,属于应用程序,不属于Linux内核范畴,Linux内核的主要特征在所有发行版中是统一的,厂商可以自由改变的是用户空间的应用程序。
Linux内核加载启动后,用户空间的第一个进程就是初始化进程,这个程序的物理文件约定位于/sbin/init,当然也可以通过传递内核参数来让内核启动指定的程序。这个进程的特点是进程号为1,代表第一个运行的用户空间进程。不同发行版采用了不同的启动程序,主要有以下几种主流选择:
(1)以Ubuntu为代表的Linux发行版采用upstart。
(2)以7.0版本之前的CentOS为代表的System V init。
(3)CentOS7.0版本的systemd。
下面是CentOS6.5和CentOS7两个版本初始化进程的信息截图。
CentOS6.5采用的是systemV init
CentOS7 采用的是systemd:
Linux内核加载启动后,用户空间的第一个进程就是初始化进程,这个程序的物理文件约定位于/sbin/init,当然也可以通过传递内核参数来让内核启动指定的程序。这个进程的特点是进程号为1,代表第一个运行的用户空间进程。不同发行版采用了不同的启动程序,主要有以下几种主流选择:
(1)以Ubuntu为代表的Linux发行版采用upstart。
(2)以7.0版本之前的CentOS为代表的System V init。
(3)CentOS7.0版本的systemd。
下面是CentOS6.5和CentOS7两个版本初始化进程的信息截图。
CentOS6.5采用的是systemV init
CentOS7 采用的是systemd
摘自:http://blog.csdn.net/smstong/article/details/39317491
参考:https://blog.linuxeye.com/400.html
=======================centos7上systemd详解============================
CentOS 7继承了RHEL 7的新的特性,例如强大的systemd, 而systemd的使用也使得以往系统服务的/etc/init.d的启动脚本的方式就此改变, 也大幅提高了系统服务的运行效率。但服务的配置和以往也发生了极大的不同,同时变的简单而易用了许多。
CentOS 7的服务systemctl脚本存放在:/usr/lib/systemd/,有系统 system 和用户 user 之分, 即:/usr/lib/systemd/system 和 /usr/lib/systemd/user
配置文件
这里我们先要说明一下unit的文件位置,一般主要有三个目录:
/lib/systemd/system
/run/systemd/system
/etc/systemd/system
这三个目录的配置文件优先级依次从低到高,如果同一选项三个地方都配置了,优先级高的会覆盖优先级低的。 系统安装时,默认会将unit文件放在/lib/systemd/system目录。如果我们想要修改系统默认的配置,比如nginx.service,一般有两种方法:
在/etc/systemd/system目录下创建nginx.service文件,里面写上我们自己的配置。
在/etc/systemd/system下面创建nginx.service.d目录,在这个目录里面新建任何以.conf结尾的文件,然后写入我们自己的配置。推荐这种做法。
/run/systemd/system这个目录一般是进程在运行时动态创建unit文件的目录,一般很少修改,除非是修改程序运行时的一些参数时,即Session级别的,才在这里做修改。
服务配置
每一个服务以.service结尾,一般会分为3部分:[Unit]、[Service]和[Install],就以nginx为例吧,具体内容如下:
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
配置项说明
下面分别解释下着三部分的含义
[Unit]
Description : 服务的简单描述
Documentation : 服务文档
After= : 依赖,仅当依赖的服务启动之后再启动自定义的服务单元
[Service]
Type : 启动类型simple、forking、oneshot、notify、dbus
Type=simple(默认值):systemd认为该服务将立即启动,服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型
Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求, 使用此类型启动即可。使用此启动类型应同时指定PIDFile=,以便systemd能够跟踪服务的主进程。
Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。
Type=notify:与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号,这一通知的实现由 libsystemd-daemon.so 提供
Type=dbus:若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。
PIDFile : pid文件路径
ExecStartPre :启动前要做什么,上文中是测试配置文件 -t
ExecStart:启动
ExecReload:重载
ExecStop:停止
PrivateTmp:True表示给服务分配独立的临时空间
[Install]
WantedBy:服务安装的用户模式,从字面上看,就是想要使用这个服务的有是谁?上文中使用的是:multi-user.target ,就是指想要使用这个服务的目录是多用户。
每一个.target实际上是链接到我们单位文件的集合,当我们执行
systemctl enable nginx.service
就会在 /etc/systemd/system/multi-user.target.wants/ 目录下新建一个 /usr/lib/systemd/system/nginx.service 文件的链接。
systemctl status logstash.service
● logstash.service - logstash
Loaded: loaded (/etc/systemd/system/logstash.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2020-07-16 10:51:32 CST; 29min ago
systemctl is-enabled logstash.service
enabled
/etc/systemd/system/logstash.service
操作示例
下面是几个最常用的service操作:
# 自启动
systemctl enable nginx.service
# 禁止自启动
systemctl disable nginx.service
# 启动服务
systemctl start nginx.service
# 停止服务
systemctl stop nginx.service
# 重启服务
systemctl restart nginx.service
# 查看Unit定义文件
systemctl cat nginx.service
# 编辑Unit定义文件
systemctl edit nginx.service
# 重新加载Unit定义文件
systemctl reload nginx.service
# 列出已启动的所有unit,就是已经被加载到内存中
systemctl list-units
# 列出系统已经安装的所有unit,包括那些没有被加载到内存中的unit
systemctl list-unit-files
# 查看服务的日志
journalctl -u nginx.service # 还可以配合`-b`一起使用,只查看自本次系统启动以来的日志
# 查看所有target下的unit
systemctl list-unit-files --type=target
# 查看默认target,即默认的运行级别。对应于旧的`runlevel`命令
systemctl get-default
# 设置默认的target
systemctl set-default multi-user.target
# 查看某一target下的unit
systemctl list-dependencies multi-user.target
# 切换target,不属于新target的unit都会被停止
systemctl isolate multi-user.target
systemctl poweroff # 关机
systemctl reboot # 重启
systemctl rescue # 进入rescue模式
参考资料
create systemd unit files
NGINX systemd service file
Systemd introduction
From:https://www.xncoding.com/2016/06/07/linux/systemd.html
(转)关于信号量sem_wait的整理
Unix/LinuxC技术 jackx 2015-2-6 17:25
(转) linux管道与套接字的调试工具
Unix/LinuxC技术 jackx 2015-2-3 09:17
背景:多进程时用管道进行子进程间或子进程于线程之间通讯,出现父进程已经双close后还是出现了当有请求来时,子进程写入处理线程时管道阻塞住了,怎么办,管道调试试试看了,学习备忘下。
1)管道的调试
阅读全文
1)管道的调试

背景:nginx.conf里指定了nginx的error_log:error_log /data/logs/nginx/nginx_error.log; 该文件不在nginx的logs下面,于是我把这个logs文件夹都给删除了: rm -Rf /usr/local/nginx/logs,发现在启动时会会报一个alert错,nginx: [alert] could not open error log file: open() "/usr/local/nginx/logs/error.log" failed (2: No such file or directory)的研究探讨。
阅读全文

背景:本人的vps服务器的带宽是5M,但是经常出现很多*163data.com.cn的访问量,还经常是访问首页。
用如下命令看,还有google也来凑热闹,如下:
结果都是:
11:29:58.515423 IP (tos 0x0, ttl 121, id 43931, offset 0, flags [DF], proto 6, length: 92) 14.122.61.58.broad.sz.gd.dynamic.163data.com.cn.31292 > *.*.*.*.ssh: P 6137:6189(52) ack 1219120 win 16448
google-public-dns-a.google.com.domain > jackxiang.com.50570: [udp sum ok] 1064 q: PTR? 111.15.181.220.in-addr.arpa. 1/0/0 111.15.181.220.in-addr.arpa. PTR m15-111.126.com. (74)
都是上面的输出.
用linux下的iftop查看,随便抓两个IP在ip138.com查一下,吓一跳:
55.10.89.110.broad.pt.fj.dynamic.163data.com.cn
您查询的IP:55.10.89.110
本站主数据:美国 弗吉尼亚美国陆军部队
参考数据一:美国 弗吉尼亚美国陆军部队
185.5.43.120.broad.pt.fj.dynamic.163data.com.cn
您查询的IP:185.5.43.120
本站主数据:俄罗斯
参考数据一:RIPE
197.192.26.117.broad.pt.fj.dynamic.163data.com.cn
您查询的IP:197.192.26.117
本站主数据:埃及
参考数据一:埃及
用了百度云加速,这个没啥问题:
jackxiang.com => 183.60.235.58 1.27Mb 1.12Mb 941Kb
您查询的IP:183.60.235.58
本站主数据:广东省佛山市 百度云加速节点 电信
参考数据一:广东省深圳市 电信
——————————————————————————————————————————————————————————————
第一:是不是被攻击了?
首先163data是电信的上网导航,如果你家用的是电信宽带并且走电信的DNS,默认都会显示成163data登陆的,这个就和代理服务器差不多。
那为何有美国的IP在里面呢?我晕,难不成真有攻击黑客吗,在弗吉尼亚美国陆军部队?通过电信来到我们中国到联通的机房?纳闷。
第二:这是电信动态IP地址的反向解析名字.
广州电信做了adsl等动态ip的反向解析,要命的是,没做正向解析。
能从IP反解到IP.broad.gz.gd.dynamic.163data.com.cn
但从反IP.broad.gz.gd.dynamic.163data.com.cn却不能解析到IP。
域名都过期了,不知道电信干什么的....电信从来不会主动为用户做反解的,部分地区是收费的,并且还要看用户类型。
___________________________________________________________________________________________________
不少站长不知道163data.com.cn是什么,在搜索引擎上搜索也找不到几条满意的结果,但是每天有大量来自163data.com.cn的用户访问自己的网站,怕被采集或者被攻击,所以很着急。
我之前也不知道,后来在使用一款WordPress的插件时(装了个WordPress打分插件), 得知自己的IP地址也属于xxx.dynamic.163data.com.cn的形式。所以xxx.163data.com.cn形式的IP地址,其实 是每个中国电信上网用户的IP反向解析地址,中国电信之所以要把IP地址进行动态反向解析,主要是为了防止垃圾邮件,减少黑客攻击等等。
本页末尾的小插件显示出了您当前的IP地址和HostName(如果看不到请稍等片刻,再按F5刷新,可能需要多刷新几次),我的HostName就是xxx.broad.xw.sh.dynamic.163data.com.cn的样子。
(你也可以登录IP Chicken查看自己的IP和Name Address,我登录上去后,显示了我的IP地址,和我的Name Address: xx.xx.xx.xx.broad.xw.sh.dynamic.163data.com.cn。)
所以每天有大量来自163data.com.cn的访客访问网站不应该担心,而应该高兴,因为那都是通过电信网络上网的网友啊,呵呵。如果你屏蔽了163data.com.cn,那么所有电信用户都访问不了你的网站了。
IP地址反向解析就是服务器根据邮件信头文件显示的IP地址进行反向解析,如果反向解析这个IP所对应的域名是许可的域名,就接受这封邮件。如果反向解析发现这个IP没有对应到许可的域名,就拒接邮件。
据介绍,实施动态IP地址反向解析工作可以有效防止黑客攻击和垃圾邮件、控制网络带宽、节省DNS系统资源等,有助于减少用户投诉,净化网络环境,提升网络服务质量。
用如下命令看,还有google也来凑热闹,如下:
结果都是:
11:29:58.515423 IP (tos 0x0, ttl 121, id 43931, offset 0, flags [DF], proto 6, length: 92) 14.122.61.58.broad.sz.gd.dynamic.163data.com.cn.31292 > *.*.*.*.ssh: P 6137:6189(52) ack 1219120 win 16448
google-public-dns-a.google.com.domain > jackxiang.com.50570: [udp sum ok] 1064 q: PTR? 111.15.181.220.in-addr.arpa. 1/0/0 111.15.181.220.in-addr.arpa. PTR m15-111.126.com. (74)
都是上面的输出.
用linux下的iftop查看,随便抓两个IP在ip138.com查一下,吓一跳:
55.10.89.110.broad.pt.fj.dynamic.163data.com.cn
您查询的IP:55.10.89.110
本站主数据:美国 弗吉尼亚美国陆军部队
参考数据一:美国 弗吉尼亚美国陆军部队
185.5.43.120.broad.pt.fj.dynamic.163data.com.cn
您查询的IP:185.5.43.120
本站主数据:俄罗斯
参考数据一:RIPE
197.192.26.117.broad.pt.fj.dynamic.163data.com.cn
您查询的IP:197.192.26.117
本站主数据:埃及
参考数据一:埃及
用了百度云加速,这个没啥问题:
jackxiang.com => 183.60.235.58 1.27Mb 1.12Mb 941Kb
您查询的IP:183.60.235.58
本站主数据:广东省佛山市 百度云加速节点 电信
参考数据一:广东省深圳市 电信
——————————————————————————————————————————————————————————————
第一:是不是被攻击了?
首先163data是电信的上网导航,如果你家用的是电信宽带并且走电信的DNS,默认都会显示成163data登陆的,这个就和代理服务器差不多。
那为何有美国的IP在里面呢?我晕,难不成真有攻击黑客吗,在弗吉尼亚美国陆军部队?通过电信来到我们中国到联通的机房?纳闷。
第二:这是电信动态IP地址的反向解析名字.
广州电信做了adsl等动态ip的反向解析,要命的是,没做正向解析。
能从IP反解到IP.broad.gz.gd.dynamic.163data.com.cn
但从反IP.broad.gz.gd.dynamic.163data.com.cn却不能解析到IP。
域名都过期了,不知道电信干什么的....电信从来不会主动为用户做反解的,部分地区是收费的,并且还要看用户类型。
___________________________________________________________________________________________________
不少站长不知道163data.com.cn是什么,在搜索引擎上搜索也找不到几条满意的结果,但是每天有大量来自163data.com.cn的用户访问自己的网站,怕被采集或者被攻击,所以很着急。
我之前也不知道,后来在使用一款WordPress的插件时(装了个WordPress打分插件), 得知自己的IP地址也属于xxx.dynamic.163data.com.cn的形式。所以xxx.163data.com.cn形式的IP地址,其实 是每个中国电信上网用户的IP反向解析地址,中国电信之所以要把IP地址进行动态反向解析,主要是为了防止垃圾邮件,减少黑客攻击等等。
本页末尾的小插件显示出了您当前的IP地址和HostName(如果看不到请稍等片刻,再按F5刷新,可能需要多刷新几次),我的HostName就是xxx.broad.xw.sh.dynamic.163data.com.cn的样子。
(你也可以登录IP Chicken查看自己的IP和Name Address,我登录上去后,显示了我的IP地址,和我的Name Address: xx.xx.xx.xx.broad.xw.sh.dynamic.163data.com.cn。)
所以每天有大量来自163data.com.cn的访客访问网站不应该担心,而应该高兴,因为那都是通过电信网络上网的网友啊,呵呵。如果你屏蔽了163data.com.cn,那么所有电信用户都访问不了你的网站了。
IP地址反向解析就是服务器根据邮件信头文件显示的IP地址进行反向解析,如果反向解析这个IP所对应的域名是许可的域名,就接受这封邮件。如果反向解析发现这个IP没有对应到许可的域名,就拒接邮件。
据介绍,实施动态IP地址反向解析工作可以有效防止黑客攻击和垃圾邮件、控制网络带宽、节省DNS系统资源等,有助于减少用户投诉,净化网络环境,提升网络服务质量。
打嗝不止怎么办?试试这8个小窍门,好有用哦!
打嗝这么尴尬的事,必须得止住哦!那么打嗝不止该怎么办?小编给你支招。
1、喝水弯腰法
喝几口温开水,慢慢咽下,并做弯腰90度的动作10~15次。因胃部离膈肌较近,可从内部温暖膈肌,在弯腰时,内脏还会对膈肌起到按摩作用,缓解膈肌痉挛,达到止嗝的目的。
2、伸拉舌头法
打嗝不止时,用一块干净纱布垫在舌头上,用手指捏住舌头向外伸拉。此时,会感到腹部有气体上升,打嗝自然消除。
3、采用深呼吸的方法
比如在进食时发生呃逆可以暂停进食,作几次深呼吸,往往在短时内能止住。
呃逆频繁时,可自己或请旁人用手指压迫两侧的〝少商〞穴。〝少商〞穴位于大拇指甲根部桡侧面,距指甲缘约0.6公分,在黑白肉际交界处。压迫时要用一定的力量,使患者有明显酸痛感。患者自行压迫可两手交替进行。
4、屏气法
5、按摩有效治呃逆
取一根细棒,一端裹上棉花(如手边无棒,可用竹筷的细端包上棉花代替),放入患者口中,用其软端按端前软颚正中线一点,此点的位置正好在硬、软颚交界处稍后面。一般按摩一分钟就能有效地控制呃逆。
6、惊吓法
趁不注意猛拍一下打嗝者的后背,也能止嗝。因为惊吓作为一种强烈的情绪刺激,可通过皮层传至皮下中枢,抑止膈肌痉挛。但有高血压、心脏病人应慎用。
7、纸袋呼气法
用一个小塑胶袋,罩住自己的口鼻,进行3~5次的深呼吸。用呼出的二氧化碳重复吸入,增加血液中二氧化碳的浓度,来调节,抑制打嗝。
8、舌下放糖法
吃一匙糖,干吞(不配水),可以在数分钟后止住打嗝。糖在口腔里可能改变了原来的神经冲动,以阻挠横膈膜的肌肉作间歇性地收缩。
打嗝这么尴尬的事,必须得止住哦!那么打嗝不止该怎么办?小编给你支招。
1、喝水弯腰法
喝几口温开水,慢慢咽下,并做弯腰90度的动作10~15次。因胃部离膈肌较近,可从内部温暖膈肌,在弯腰时,内脏还会对膈肌起到按摩作用,缓解膈肌痉挛,达到止嗝的目的。
2、伸拉舌头法
打嗝不止时,用一块干净纱布垫在舌头上,用手指捏住舌头向外伸拉。此时,会感到腹部有气体上升,打嗝自然消除。
3、采用深呼吸的方法
比如在进食时发生呃逆可以暂停进食,作几次深呼吸,往往在短时内能止住。
呃逆频繁时,可自己或请旁人用手指压迫两侧的〝少商〞穴。〝少商〞穴位于大拇指甲根部桡侧面,距指甲缘约0.6公分,在黑白肉际交界处。压迫时要用一定的力量,使患者有明显酸痛感。患者自行压迫可两手交替进行。
4、屏气法
5、按摩有效治呃逆
取一根细棒,一端裹上棉花(如手边无棒,可用竹筷的细端包上棉花代替),放入患者口中,用其软端按端前软颚正中线一点,此点的位置正好在硬、软颚交界处稍后面。一般按摩一分钟就能有效地控制呃逆。
6、惊吓法
趁不注意猛拍一下打嗝者的后背,也能止嗝。因为惊吓作为一种强烈的情绪刺激,可通过皮层传至皮下中枢,抑止膈肌痉挛。但有高血压、心脏病人应慎用。
7、纸袋呼气法
用一个小塑胶袋,罩住自己的口鼻,进行3~5次的深呼吸。用呼出的二氧化碳重复吸入,增加血液中二氧化碳的浓度,来调节,抑制打嗝。
8、舌下放糖法
吃一匙糖,干吞(不配水),可以在数分钟后止住打嗝。糖在口腔里可能改变了原来的神经冲动,以阻挠横膈膜的肌肉作间歇性地收缩。
1.单击“开始”,依次指向“所有程序”、“附件”、“系统工具”,然后单击“磁盘清理 C:
下面来罗列一下判断远端已经断开的方法:
法一:
当recv()返回值小于等于0时,socket连接断开。但是还需要判断 errno是否等于 EINTR,如果errno == EINTR 则说明recv函数是由于程序接收到信号后返回的,socket连接还是正常的,不应close掉socket连接。
法二:
struct tcp_info info;
int len=sizeof(info);
getsockopt(sock, IPPROTO_TCP, TCP_INFO, &info, (socklen_t *)&len);
if((info.tcpi_state==TCP_ESTABLISHED)) 则说明未断开 else 断开
法三:
若使用了select等系统函数,若远端断开,则select返回1,recv返回0则断开。其他注意事项同法一。
法四:
int keepAlive = 1; // 开启keepalive属性
int keepIdle = 60; // 如该连接在60秒内没有任何数据往来,则进行探测
int keepInterval = 5; // 探测时发包的时间间隔为5 秒
int keepCount = 3; // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.
setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive));
setsockopt(rs, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));
setsockopt(rs, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));
setsockopt(rs, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));
设置后,若断开,则在使用该socket读写时立即失败,并返回ETIMEDOUT错误
法五:
自己实现一个心跳检测,一定时间内未收到自定义的心跳包则标记为已断开。
摘自:http://blog.csdn.net/god2469/article/details/8801356
使用 epoll或poll ,如何确定 与客户端的链接断开 ?
http://bbs.csdn.net/topics/240073448
epoll事件检测:
http://www.360doc.com/content/09/0812/09/1894_4858884.shtml
epoll的各个事件触发条件测试:
http://www.cppblog.com/yangsf5/archive/2009/03/12/76353.html
利用epoll和多进程解决高并发问题 :
http://blog.csdn.net/ypbsyy/article/details/38046267
法一:
当recv()返回值小于等于0时,socket连接断开。但是还需要判断 errno是否等于 EINTR,如果errno == EINTR 则说明recv函数是由于程序接收到信号后返回的,socket连接还是正常的,不应close掉socket连接。
法二:
struct tcp_info info;
int len=sizeof(info);
getsockopt(sock, IPPROTO_TCP, TCP_INFO, &info, (socklen_t *)&len);
if((info.tcpi_state==TCP_ESTABLISHED)) 则说明未断开 else 断开
法三:
若使用了select等系统函数,若远端断开,则select返回1,recv返回0则断开。其他注意事项同法一。
法四:
int keepAlive = 1; // 开启keepalive属性
int keepIdle = 60; // 如该连接在60秒内没有任何数据往来,则进行探测
int keepInterval = 5; // 探测时发包的时间间隔为5 秒
int keepCount = 3; // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.
setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive));
setsockopt(rs, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));
setsockopt(rs, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));
setsockopt(rs, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));
设置后,若断开,则在使用该socket读写时立即失败,并返回ETIMEDOUT错误
法五:
自己实现一个心跳检测,一定时间内未收到自定义的心跳包则标记为已断开。
摘自:http://blog.csdn.net/god2469/article/details/8801356
使用 epoll或poll ,如何确定 与客户端的链接断开 ?
http://bbs.csdn.net/topics/240073448
epoll事件检测:
http://www.360doc.com/content/09/0812/09/1894_4858884.shtml
epoll的各个事件触发条件测试:
http://www.cppblog.com/yangsf5/archive/2009/03/12/76353.html
利用epoll和多进程解决高并发问题 :
http://blog.csdn.net/ypbsyy/article/details/38046267
问题:我把图片弄成了超大图标都看不到图,只是个图标,之前都不会这样,文件夹设置那里也没有在”始终显示图标,怎么办?
解决方案:
第一:
打开计算机—》组织—》文件夹和搜索选项—》查看(tab标签)—》去掉”始终显示图标,不显示缩略图”的对勾;
第二:
我的电脑 属性 高级 性能 设置 在其中的“显示缩略图,而不是显示图标”中打勾。
看看,是不是有了!哈哈。
分别摘自:
http://www.2cto.com/os/201311/254368.html
http://zhidao.baidu.com/link?url=N1BO7RyTvMJNMjX4LMlONCiyBRuEDMN-7QaMdEUSumWMW3FS13yhJysiFD3sDaOHwHK0ozit3__UPUb24v6aZq
解决方案:
第一:
打开计算机—》组织—》文件夹和搜索选项—》查看(tab标签)—》去掉”始终显示图标,不显示缩略图”的对勾;
第二:
我的电脑 属性 高级 性能 设置 在其中的“显示缩略图,而不是显示图标”中打勾。
看看,是不是有了!哈哈。
分别摘自:
http://www.2cto.com/os/201311/254368.html
http://zhidao.baidu.com/link?url=N1BO7RyTvMJNMjX4LMlONCiyBRuEDMN-7QaMdEUSumWMW3FS13yhJysiFD3sDaOHwHK0ozit3__UPUb24v6aZq