[实践OK] 百度云解析之vps安装centOS7 系统下利用iptables配置IP地址白名单放行百度云CDN加速(百度云加速)IP地址群。
Unix/LinuxC技术 jackxiang 2014-12-17 21:42
背景:使用vps性能不是太好,于是否有恶意的访问增加流量,而此时呢,想用云加速,但一加速就被iptables分析日志干成黑名单了,有时一访问太快了给nginx拒绝了,实现方法见Url:http://jackxiang.com/post/7671/ 。如何防止误伤到去加速呢,百度提供出了他们的IP地址,我们可以用白名单写入到iptables里于是就好了。
把NS指向百度的:修改DNS地址到 ns1.bdydns.cnns2.bdydns.cn
nslookup用法:怎么查看一个网站域名的NS服务器地址
nslookup,然后空格,加上一个“/”斜杠,再加上一个问号,就能出现对应指令的所有参数和使用方法。
我们如果想看一个域名的NS值,最简便的方法是在nslookup后面直接跟上域名,注意不要带http://,就会出现这个域名对应的NS记录值。
nslookup www.jackxiang.com
服务器: dnscache33
Address: 127.0.0.1
非权威应答:
名称: ns1.bdydns.cn
Addresses: 180.97.36.63
111.206.223.119
Aliases: www.jackxiang.com
后面有兄弟邮件询问这个,我作了下简单回复:
Dear:
一般不建议网络使用白名单,因为有很多位置的IP你没法判定完全,如来自美国、法国
一般使用黑名单的较多,谁ddos,就拉黑谁,百度的所谓cdn也就是他从一些自己的IP
机器下面来抓你服务器的页面,后存起来,如果是最新的用户就不用访问你的服务器。
在 2015-09-02 15:32:16,"木秀于林" <8047105XX@qq.com> 写道:
你好向东!
[实践OK] 云vps安装centOS7 系统下利用iptables配置IP地址白名单放行百度云CDN加速(百度云加速)IP地址群
看到你发布的这篇文章很不错,就是研究了半天没搞定,
我用了百度云加速,现在网站访问除了问题,百度客服说服务器拦截了百度IP,空间商说没有防火墙,空间商让我在AMH面板安装AMNetwork试试,安装后在面板添加代码怎么也搞不定,显示AMNetwork : 防火墙配置失败,请检查更改规则是否正确。
我的QQ号8047105XX
在您有空的时候希望帮一下,谢谢了!
————————————————————————————————————————————————————————————————
实践证明:
https://jackxiang.com 没法加速Https(不加速透传也成),不想加速,只加速:http://jackxiang.com 和http://www.jackxiang.com都是没有问题,但我要管理用https,经过加速后没法访问,这块暂时不用云加速。
关于iptable如何在开机启动和crontab里放入自动把某些IP及端口打开或扔进防火墙的链接如下:
http://jackxiang.com/post/7782/
编辑iptables配置文件,将文件内容更改为如下,则具备了ip地址白名单功能
#vim /etc/sysconfig/iptables
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-N whitelist
-A whitelist -s 1.2.3.0/24 -j ACCEPT
-A whitelist -s 4.5.6.7 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j whitelist
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j whitelist
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j whitelist
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
6~8 行是添加白名单列表,可以是ip段或者单个ip地址
10~12行 注意的是“-j whitelist”而不是“-j ACCEPT”,前者将该端口访问权限限制在白名单内,后者为不限制
13行 任何ip地址都能ping通该主机,因为“-j ACCEPT”没有做相应限制
配置完毕后,运行命令重启防火墙使规则生效
#systemctl restart iptables.service
上述摘自:http://blog.chinaunix.net/uid-13344516-id-4573922.html
实践如下:
百度云加速列表写成iptables白名单如下,这样就可以防止iptables分析Http请求日志时把它过滤掉:
好像会报254错,但写成24就没错了:
百度去加速的白名单来源:
http://yunjiasu.baidu.com/website/node/#domain=jackxiang.com
jackxiang.com 分配到的节点
地点 线路 IP
济南 联通 119.188.132.68
济南 联通 119.188.132.67
石家庄 联通 61.182.137.6
西安 电信 117.34.28.77
西安 电信 117.34.28.78
苏州 电信 61.155.149.78
苏州 电信 61.155.149.79
南宁 电信 222.216.190.62
南宁 电信 222.216.190.63
百度云加速所有的节点IP
地点 线路 IP段
佛山 电信 183.60.235.0 ~ 183.60.235.254
石家庄 联通 61.182.137.0 ~ 61.182.137.254
南宁 电信 222.216.190.0 ~ 222.216.190.254
济南 联通 119.188.14.0 ~ 119.188.14.254
苏州 电信 61.155.149.0 ~ 61.155.149.254
济南 联通 119.188.132.0 ~ 119.188.132.254
西安 电信 117.34.28.0 ~ 117.34.28.254
郑州 联通 42.236.7.0 ~ 42.236.7.254
关于ssl免费版本不支持的问题回复 AddTime:2015-02-03:
我问题:
https://jackxiang.com 没法加速Https(不加速透传也成),不想加速,只加速:http://jackxiang.com 是没有问题,但我要管理用https,你们没有给我转过支。
回复如下:
您好,目前的免费版本是不支持https的,后续收费版才会支持。
————————————EOF———————————————
把NS指向百度的:修改DNS地址到 ns1.bdydns.cnns2.bdydns.cn
nslookup用法:怎么查看一个网站域名的NS服务器地址
nslookup,然后空格,加上一个“/”斜杠,再加上一个问号,就能出现对应指令的所有参数和使用方法。
我们如果想看一个域名的NS值,最简便的方法是在nslookup后面直接跟上域名,注意不要带http://,就会出现这个域名对应的NS记录值。
nslookup www.jackxiang.com
服务器: dnscache33
Address: 127.0.0.1
非权威应答:
名称: ns1.bdydns.cn
Addresses: 180.97.36.63
111.206.223.119
Aliases: www.jackxiang.com
后面有兄弟邮件询问这个,我作了下简单回复:
Dear:
一般不建议网络使用白名单,因为有很多位置的IP你没法判定完全,如来自美国、法国
一般使用黑名单的较多,谁ddos,就拉黑谁,百度的所谓cdn也就是他从一些自己的IP
机器下面来抓你服务器的页面,后存起来,如果是最新的用户就不用访问你的服务器。
在 2015-09-02 15:32:16,"木秀于林" <8047105XX@qq.com> 写道:
你好向东!
[实践OK] 云vps安装centOS7 系统下利用iptables配置IP地址白名单放行百度云CDN加速(百度云加速)IP地址群
看到你发布的这篇文章很不错,就是研究了半天没搞定,
我用了百度云加速,现在网站访问除了问题,百度客服说服务器拦截了百度IP,空间商说没有防火墙,空间商让我在AMH面板安装AMNetwork试试,安装后在面板添加代码怎么也搞不定,显示AMNetwork : 防火墙配置失败,请检查更改规则是否正确。
我的QQ号8047105XX
在您有空的时候希望帮一下,谢谢了!
————————————————————————————————————————————————————————————————
实践证明:
https://jackxiang.com 没法加速Https(不加速透传也成),不想加速,只加速:http://jackxiang.com 和http://www.jackxiang.com都是没有问题,但我要管理用https,经过加速后没法访问,这块暂时不用云加速。
关于iptable如何在开机启动和crontab里放入自动把某些IP及端口打开或扔进防火墙的链接如下:
http://jackxiang.com/post/7782/
编辑iptables配置文件,将文件内容更改为如下,则具备了ip地址白名单功能
#vim /etc/sysconfig/iptables
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-N whitelist
-A whitelist -s 1.2.3.0/24 -j ACCEPT
-A whitelist -s 4.5.6.7 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j whitelist
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j whitelist
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j whitelist
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
6~8 行是添加白名单列表,可以是ip段或者单个ip地址
10~12行 注意的是“-j whitelist”而不是“-j ACCEPT”,前者将该端口访问权限限制在白名单内,后者为不限制
13行 任何ip地址都能ping通该主机,因为“-j ACCEPT”没有做相应限制
配置完毕后,运行命令重启防火墙使规则生效
#systemctl restart iptables.service
上述摘自:http://blog.chinaunix.net/uid-13344516-id-4573922.html
实践如下:
百度云加速列表写成iptables白名单如下,这样就可以防止iptables分析Http请求日志时把它过滤掉:
好像会报254错,但写成24就没错了:
百度去加速的白名单来源:
http://yunjiasu.baidu.com/website/node/#domain=jackxiang.com
jackxiang.com 分配到的节点
地点 线路 IP
济南 联通 119.188.132.68
济南 联通 119.188.132.67
石家庄 联通 61.182.137.6
西安 电信 117.34.28.77
西安 电信 117.34.28.78
苏州 电信 61.155.149.78
苏州 电信 61.155.149.79
南宁 电信 222.216.190.62
南宁 电信 222.216.190.63
百度云加速所有的节点IP
地点 线路 IP段
佛山 电信 183.60.235.0 ~ 183.60.235.254
石家庄 联通 61.182.137.0 ~ 61.182.137.254
南宁 电信 222.216.190.0 ~ 222.216.190.254
济南 联通 119.188.14.0 ~ 119.188.14.254
苏州 电信 61.155.149.0 ~ 61.155.149.254
济南 联通 119.188.132.0 ~ 119.188.132.254
西安 电信 117.34.28.0 ~ 117.34.28.254
郑州 联通 42.236.7.0 ~ 42.236.7.254
关于ssl免费版本不支持的问题回复 AddTime:2015-02-03:
我问题:
https://jackxiang.com 没法加速Https(不加速透传也成),不想加速,只加速:http://jackxiang.com 是没有问题,但我要管理用https,你们没有给我转过支。
回复如下:
您好,目前的免费版本是不支持https的,后续收费版才会支持。
————————————EOF———————————————
今天不小心在linux下执行了一下rm -Rf /*,有所感悟。
Unix/LinuxC技术 jackxiang 2014-12-15 20:13
我上午还在说产品啥的弱点,下午就发现Linux一个视频文件怎么删除不掉,问tencent PHP群里,一兄弟给出了一个:rm -Rf /* ,当时没过脑子,没细看,给贴进去删了,出问题了,还好及时ctrl C,庆幸的是把bin目录删除了,差点就重装(ssh连接不上面没退出,scp还在),从别的测试机直接拷贝过来才好了,真是好险,这就是我的弱点,差点惹出大事,就是剪刀手没多过一过脑子,真心不容易啊。
-bash: ls:command not found
/etc/sysconfig/bash-prompt-xterm:line 1:grep: command not found
/etc/sysconfig/bash-prompt-xterm:line 1:cut: command not found
/etc/sysconfig/bash-prompt-xterm:line 1:awk: command not found
一cd到/,我x,全没了,一身冷汗,vim还在,cd还能cd,这个cd是内核实现的:
type命令可以知道,cd命令是builtin形式的命令,那么按我的理解应该是在内核中实现了:
type cd
cd is a shell builtin
ls就不一样的用了alian:
type ls
ls is aliased to `ls --color=tty'
x哥说:别退出来, 赶紧备份东西吧. 我是说别退出ssh
ext2的, 好像有些文件是可以恢复的,先别退出SSH, 有什么数据都先备份出来吧, @@
我记得lsof也可以找回部分文件,
但前提好像是要多个人打开同一个文件的样子.
解决办法:
我还找了下张宴兄弟的那篇关于恢复文章:http://zyan.cc/linux_ext3_undelete/
我当时还算镇定,大不了重装,此时已经下班,同事叫我开走了,我说我搞出问题了,他过来找了个椅子坐我旁边,大致5分钟,我此时还有一怕,vpn经常挂掉,会退出,我祈祷别给我ssh挂了,挂了真挂了。还好没有挂,至少在此时没有挂,我让他走,他找了个凳子坐我旁边,我就开始摸索,其实这种事情,当年在腾讯也发生过类似的,但后来是重新装了系统,回想一下,也就作最坏打算了,开整,我整个一会,说要不兄弟先回去吧,他没动,那就接着整:
经过命令提示,初步判断是bin目录有问题,因为vi还能使用,vi了下/etc/shadow(重开ssh连接不上了),但还在,PATH目录:
/etc/profile 还在,/root/.bash_profile还在,经过whereis ls :
whereis ls
ls: /bin/ls 判定是bin给删除了,还好就是bin文件给删除了,我直接cd / ,(此时这个目录一个目录都没有啊,我是硬着头皮拷贝的啊,我还准备用sz rz的,要是这个scp挂了,当时还好想想目录拷贝要加-r,我估计scp要真给挂了,一个个拷贝要死人的。)
于是,从其他机器拷贝一样的bin到这儿,注意:64位linux一样的版本,一样的虚拟环境机器才行。
输入密码,拷贝完毕,好了,好险,还好。
最后,兄弟开个玩笑,我信了:
Jack-回忆未来 2014/12/15 星期一 20:30:01
这个群让我把系统删除的兄弟,我已经修好了,老天保佑,还好只是/bin给干掉了。你让我进步了,写这儿了:https://jackxiang.com/post/7690/
OMG-jiXXXXX 2014/12/15 星期一 20:32:19
他也就是开个玩笑,没有损失就好
share
好坏 2014/12/15 星期一 20:32:41
bob omg
2014/12/15 星期一 20:32:46
兄弟, 真心不是要害你, 发了之后,我还坏坏的一笑,可惜你没懂我
问苍天 2014/12/15 星期一 20:33:32
rm -rf这种命令你看都没看?
Jack-回忆未来 2014/12/15 星期一 20:35:08
这事情都怪兄弟我,手太快了,贴过去了,
等我再看到你那个坏笑,我已经ctrl+C了。
SuperWoMan - MIG 2014/12/15 星期一 20:35:19
流汗
没文化,真可怕
Jack-回忆未来 2014/12/15 星期一 20:42:08
说实话,当时我也蒙了,但我还是快速镇定了下来,没事就好,皆大欢喜,其实我估计我那个系统可能也不是太纯了,否则,删除不掉这种事情不会发生的,我都777了还是删除有问题,我还是相信兄弟们的力量的,以后对于小问题开玩笑,大问题尽量不要开啊,我没文化滴,或文化程度低,别忽悠俺。
mfsh**[ECC]
程序员真是一个既忠诚又花心的职业
bob omg 2014/12/15 星期一 20:53:55
兄弟, 。。。 啥也不说了
bob omg 2014/12/15 星期一 20:55:28
回头请你吃饭
Jack-回忆未来 2014/12/15 星期一 20:56:08
博文更新了下,我大致写了下过程,
啥也不说了,当年徐达和常遇春用自己的军事行动给他王保保上了一堂军事理论课,兄弟给我上了生动的一课,我想我快成名将了。
编者按:吃饭就免了,真要请随时打俺电话、微信、QQ,:-)。
x哥:
一个rm命令引发的创业故事
前儿:
rm -Rf ./* 差了一个点吧
______________________________________________________________________________________________
yang-TEG 2014/12/15 星期一 21:48:54
在一个web系统的config(k-v字段的配置表)表里面更新某个配置,执行了update config set value='xxx' 。。。没有加where,没有加limit, 改了90多条配置,然后系统挂了....
yang-ECC
2014/12/15 星期一 21:33:51
delete * 干过的。。。要吗
阅读全文
-bash: ls:command not found
/etc/sysconfig/bash-prompt-xterm:line 1:grep: command not found
/etc/sysconfig/bash-prompt-xterm:line 1:cut: command not found
/etc/sysconfig/bash-prompt-xterm:line 1:awk: command not found
一cd到/,我x,全没了,一身冷汗,vim还在,cd还能cd,这个cd是内核实现的:
type命令可以知道,cd命令是builtin形式的命令,那么按我的理解应该是在内核中实现了:
type cd
cd is a shell builtin
ls就不一样的用了alian:
type ls
ls is aliased to `ls --color=tty'
x哥说:别退出来, 赶紧备份东西吧. 我是说别退出ssh
ext2的, 好像有些文件是可以恢复的,先别退出SSH, 有什么数据都先备份出来吧, @@
我记得lsof也可以找回部分文件,
但前提好像是要多个人打开同一个文件的样子.
解决办法:
我还找了下张宴兄弟的那篇关于恢复文章:http://zyan.cc/linux_ext3_undelete/
我当时还算镇定,大不了重装,此时已经下班,同事叫我开走了,我说我搞出问题了,他过来找了个椅子坐我旁边,大致5分钟,我此时还有一怕,vpn经常挂掉,会退出,我祈祷别给我ssh挂了,挂了真挂了。还好没有挂,至少在此时没有挂,我让他走,他找了个凳子坐我旁边,我就开始摸索,其实这种事情,当年在腾讯也发生过类似的,但后来是重新装了系统,回想一下,也就作最坏打算了,开整,我整个一会,说要不兄弟先回去吧,他没动,那就接着整:
经过命令提示,初步判断是bin目录有问题,因为vi还能使用,vi了下/etc/shadow(重开ssh连接不上了),但还在,PATH目录:
/etc/profile 还在,/root/.bash_profile还在,经过whereis ls :
whereis ls
ls: /bin/ls 判定是bin给删除了,还好就是bin文件给删除了,我直接cd / ,(此时这个目录一个目录都没有啊,我是硬着头皮拷贝的啊,我还准备用sz rz的,要是这个scp挂了,当时还好想想目录拷贝要加-r,我估计scp要真给挂了,一个个拷贝要死人的。)
于是,从其他机器拷贝一样的bin到这儿,注意:64位linux一样的版本,一样的虚拟环境机器才行。
输入密码,拷贝完毕,好了,好险,还好。
最后,兄弟开个玩笑,我信了:
Jack-回忆未来 2014/12/15 星期一 20:30:01
这个群让我把系统删除的兄弟,我已经修好了,老天保佑,还好只是/bin给干掉了。你让我进步了,写这儿了:https://jackxiang.com/post/7690/
OMG-jiXXXXX 2014/12/15 星期一 20:32:19
他也就是开个玩笑,没有损失就好
share
好坏 2014/12/15 星期一 20:32:41
bob omg
2014/12/15 星期一 20:32:46
兄弟, 真心不是要害你, 发了之后,我还坏坏的一笑,可惜你没懂我
问苍天 2014/12/15 星期一 20:33:32
rm -rf这种命令你看都没看?
Jack-回忆未来 2014/12/15 星期一 20:35:08
这事情都怪兄弟我,手太快了,贴过去了,
等我再看到你那个坏笑,我已经ctrl+C了。
SuperWoMan - MIG 2014/12/15 星期一 20:35:19
流汗
没文化,真可怕
Jack-回忆未来 2014/12/15 星期一 20:42:08
说实话,当时我也蒙了,但我还是快速镇定了下来,没事就好,皆大欢喜,其实我估计我那个系统可能也不是太纯了,否则,删除不掉这种事情不会发生的,我都777了还是删除有问题,我还是相信兄弟们的力量的,以后对于小问题开玩笑,大问题尽量不要开啊,我没文化滴,或文化程度低,别忽悠俺。
mfsh**[ECC]
程序员真是一个既忠诚又花心的职业
bob omg 2014/12/15 星期一 20:53:55
兄弟, 。。。 啥也不说了
bob omg 2014/12/15 星期一 20:55:28
回头请你吃饭
Jack-回忆未来 2014/12/15 星期一 20:56:08
博文更新了下,我大致写了下过程,
啥也不说了,当年徐达和常遇春用自己的军事行动给他王保保上了一堂军事理论课,兄弟给我上了生动的一课,我想我快成名将了。
编者按:吃饭就免了,真要请随时打俺电话、微信、QQ,:-)。
x哥:
一个rm命令引发的创业故事
前儿:
rm -Rf ./* 差了一个点吧
______________________________________________________________________________________________
yang-TEG 2014/12/15 星期一 21:48:54
在一个web系统的config(k-v字段的配置表)表里面更新某个配置,执行了update config set value='xxx' 。。。没有加where,没有加limit, 改了90多条配置,然后系统挂了....
yang-ECC
2014/12/15 星期一 21:33:51
delete * 干过的。。。要吗

[实践OK]Linux上Raspberry pi下通过ssh命令行启动display图形界面浏览器并展现出来的方法,树莓派也实践Ok,见正文。
Unix/LinuxC技术 jackxiang 2014-12-15 11:02
背景:我是想在ssh下启动xwindows下的chrome并打开某个链接,用命令行启动会有问题。
我启动的是android 模拟器。 报SDL init faillure,原因是 no available video device
图形程序启动要指定DISPLAY吧
_______________________
怎么搞定的,命令行下,我想通过ssh启动xwindows下的chrome并打开某个链接也有这个问题。
要指定DISPLAY 环境变量。
我是通过vnc连上的。 先在vnc里面看看DISPLAY环境变量是啥。 我的是:1
然后运行前 指定DISPLAY=:1就可以了。
那如果不是vnc呢?怎么搞,echo $DISPLAY ?
直接在linux下用ssh连接,不是界面这个项是空的:
但是开启了vnc后,在界面里打开terminal有这个:
开启方法:https://jackxiang.com/post/7303/
DISPLAY的结果如下:
上面是我vps的vpn,下面我使用Raspberry Pi来调用自带的显示器,注意不是Raspberry Pi下的vpn呢,是液晶物理显示器,如何指定DISPLAY来通过secureCRT下的ssh打开后,设置DISPLAY环境变量后,在液晶里显示,实践OK如下:
后来安装了许多软件,后面发现其DISPLAY变量出现变化,在Raspberry Pi上接上键盘后发现变量不是上面这样,后来这样设置Ok:
此时,物理的液晶屏里会打开chrome浏览器,并试图打开jackxiang.com这个网站。
如果su成root就不行了,为什么呢?我估计是因为启动时就是以Raspberry Pi的Pi用户,而su后呢,成root了,这个显示不是root的,还是Pi的,所以不行。
新版的Raspberry pi有自带的键盘,但此键盘有一个问题,那就是键盘里的符号有些缺,于是,得这样写好脚本再在屏幕上执行:
pi@raspberrypi:~$ cat env.sh
env|grep DISPLAY > env.txt
在屏幕上执行:
sh ./env.sh
cat evn.txt
pi@raspberrypi:~$ cat env.txt
DISPLAY=:0.0
————————————————————————————————————————————————————————
在Linux/Unix类操作系统上, DISPLAY用来设置将图形显示到何处. 直接登陆图形界面或者登陆命令行界面后使用startx启动图形, DISPLAY环境变量将自动设置为:0:0, 此时可以打开终端, 输出图形程序的名称(比如xclock)来启动程序, 图形将显示在本地窗口上, 在终端上输入printenv查看当前环境变量
DISPLAY 环境变量格式如下hostname: displaynumber.screennumber,我们需要知道,在某些机器上,可能有多个显示设备共享使用同一套输入设备,例如在一台PC上连接两台CRT显示器,但是它们只共享使用一个键盘和一个鼠标。这一组显示设备就拥有一个共同的displaynumber,而这组显示设备中的每个单独的设备则拥有自己单独的 screennumber。displaynumber和screennumber都是从零开始的数字。这样,对于我们普通用户来说, displaynumber、screennumber就都是0。
hostname指Xserver所在的主机主机名或者ip地址, 图形将显示在这一机器上, 可以是启动了图形界面的Linux/Unix机器, 也可以是安装了Exceed, X-Deep/32等Windows平台运行的Xserver的Windows机器.如果Host为空, 则表示Xserver运行于本机, 并且图形程序(Xclient)使用unix socket方式连接到Xserver, 而不是TCP方式.
使用TCP方式连接时, displaynumber为连接的端口减去6000的值, 如果displaynumber为0, 则表示连接到6000端口;
使用unix socket方式连接时则表示连接的unix socket的路径,如果displaynumber为0, 则表示连接到/tmp/.X11-unix/X0 .
creennumber则几乎总是0.
来自:http://blog.sina.com.cn/s/blog_8f5296d50100xa0m.html
详细:http://blog.chinaunix.net/uid-23072872-id-3388906.html
我启动的是android 模拟器。 报SDL init faillure,原因是 no available video device
图形程序启动要指定DISPLAY吧
_______________________
怎么搞定的,命令行下,我想通过ssh启动xwindows下的chrome并打开某个链接也有这个问题。
要指定DISPLAY 环境变量。
我是通过vnc连上的。 先在vnc里面看看DISPLAY环境变量是啥。 我的是:1
然后运行前 指定DISPLAY=:1就可以了。
那如果不是vnc呢?怎么搞,echo $DISPLAY ?
直接在linux下用ssh连接,不是界面这个项是空的:
但是开启了vnc后,在界面里打开terminal有这个:
开启方法:https://jackxiang.com/post/7303/
DISPLAY的结果如下:
上面是我vps的vpn,下面我使用Raspberry Pi来调用自带的显示器,注意不是Raspberry Pi下的vpn呢,是液晶物理显示器,如何指定DISPLAY来通过secureCRT下的ssh打开后,设置DISPLAY环境变量后,在液晶里显示,实践OK如下:
后来安装了许多软件,后面发现其DISPLAY变量出现变化,在Raspberry Pi上接上键盘后发现变量不是上面这样,后来这样设置Ok:
此时,物理的液晶屏里会打开chrome浏览器,并试图打开jackxiang.com这个网站。
如果su成root就不行了,为什么呢?我估计是因为启动时就是以Raspberry Pi的Pi用户,而su后呢,成root了,这个显示不是root的,还是Pi的,所以不行。
新版的Raspberry pi有自带的键盘,但此键盘有一个问题,那就是键盘里的符号有些缺,于是,得这样写好脚本再在屏幕上执行:
pi@raspberrypi:~$ cat env.sh
env|grep DISPLAY > env.txt
在屏幕上执行:
sh ./env.sh
cat evn.txt
pi@raspberrypi:~$ cat env.txt
DISPLAY=:0.0
————————————————————————————————————————————————————————
在Linux/Unix类操作系统上, DISPLAY用来设置将图形显示到何处. 直接登陆图形界面或者登陆命令行界面后使用startx启动图形, DISPLAY环境变量将自动设置为:0:0, 此时可以打开终端, 输出图形程序的名称(比如xclock)来启动程序, 图形将显示在本地窗口上, 在终端上输入printenv查看当前环境变量
DISPLAY 环境变量格式如下hostname: displaynumber.screennumber,我们需要知道,在某些机器上,可能有多个显示设备共享使用同一套输入设备,例如在一台PC上连接两台CRT显示器,但是它们只共享使用一个键盘和一个鼠标。这一组显示设备就拥有一个共同的displaynumber,而这组显示设备中的每个单独的设备则拥有自己单独的 screennumber。displaynumber和screennumber都是从零开始的数字。这样,对于我们普通用户来说, displaynumber、screennumber就都是0。
hostname指Xserver所在的主机主机名或者ip地址, 图形将显示在这一机器上, 可以是启动了图形界面的Linux/Unix机器, 也可以是安装了Exceed, X-Deep/32等Windows平台运行的Xserver的Windows机器.如果Host为空, 则表示Xserver运行于本机, 并且图形程序(Xclient)使用unix socket方式连接到Xserver, 而不是TCP方式.
使用TCP方式连接时, displaynumber为连接的端口减去6000的值, 如果displaynumber为0, 则表示连接到6000端口;
使用unix socket方式连接时则表示连接的unix socket的路径,如果displaynumber为0, 则表示连接到/tmp/.X11-unix/X0 .
creennumber则几乎总是0.
来自:http://blog.sina.com.cn/s/blog_8f5296d50100xa0m.html
详细:http://blog.chinaunix.net/uid-23072872-id-3388906.html
错误控制台是开发工具,默认不会打开的。你装了什么扩展出现的这个问题啊?或者做了什么设置?在工具--附加组件里查看下安装的插件和扩展工具 。
工具-选项里-主要-管理助加主件-在那里找到你安装的删除或禁用:
我的是一个叫:All-in-One Gestures的禁用就好了。后又打开,它又弹出来了,说明真是这个插件引起的。
来自:http://zhidao.baidu.com/question/1859847570413928187.html
工具-选项里-主要-管理助加主件-在那里找到你安装的删除或禁用:
我的是一个叫:All-in-One Gestures的禁用就好了。后又打开,它又弹出来了,说明真是这个插件引起的。
来自:http://zhidao.baidu.com/question/1859847570413928187.html
请问在脚本中mv,默认会覆盖目标文件么?不提示直接mv覆盖参数是啥。
Unix/LinuxC技术 jackxiang 2014-12-11 14:32
Linux下挪动会提示,
你会发现是这样的,会有提示,为何,如下:
alias|grep -F mv
alias mv='mv -i'
加-f就好了。
mv -f
mv -i
看你的mv用的是那个了,一般我都会明确写上参数的。
-f, --force do not prompt before overwriting
-i, --interactive prompt before overwrite
摘录:http://bbs.chinaunix.net/thread-1037808-1-1.html
参考:http://blog.chinaunix.net/uid-23683795-id-2391087.html
你会发现是这样的,会有提示,为何,如下:
alias|grep -F mv
alias mv='mv -i'
加-f就好了。
mv -f
mv -i
看你的mv用的是那个了,一般我都会明确写上参数的。
-f, --force do not prompt before overwriting
-i, --interactive prompt before overwrite
摘录:http://bbs.chinaunix.net/thread-1037808-1-1.html
参考:http://blog.chinaunix.net/uid-23683795-id-2391087.html
chrome ff 都是用npapi写的插件,ie是activex做的,
中转站分片上传,秒传,切割的逻辑也是在同一个插件里面做的
从2014年1月起chrome将不再支持NPAPI插件
以前还有微信的摇一摇图片到手机,用firebreath 做插件,跨浏览器,跨平台。
阅读全文
中转站分片上传,秒传,切割的逻辑也是在同一个插件里面做的
从2014年1月起chrome将不再支持NPAPI插件
以前还有微信的摇一摇图片到手机,用firebreath 做插件,跨浏览器,跨平台。

C 语言中的指针和内存泄漏,程序员最值得关注的10个C开源项目。
Unix/LinuxC技术 jackxiang 2014-12-10 23:36
C 语言中的指针和内存泄漏:
http://www.admin10000.com/document/5590.html
程序员最值得关注的10个C开源项目:
http://www.admin10000.com/document/5368.html
近100个C语言基础算法案例(初级篇):
http://www.admin10000.com/document/5497.html
关于C语言 我喜欢和讨厌的十件事:
http://www.admin10000.com/document/3303.html
http://www.admin10000.com/document/5590.html
程序员最值得关注的10个C开源项目:
http://www.admin10000.com/document/5368.html
近100个C语言基础算法案例(初级篇):
http://www.admin10000.com/document/5497.html
关于C语言 我喜欢和讨厌的十件事:
http://www.admin10000.com/document/3303.html
如何让exec()自己运行,php页面继续运行,让PHP不再阻塞。
Php/Js/Shell/Go jackxiang 2014-12-10 14:50
背景:用Nginx上传插件实现大文件分片上传后,处理子程序的程序需要每次对分片进行合并,但又不想耗费PHP太多内存,只好让shell来干这事儿,同时呢,又不想让PHP用exec合并文件时出现等待,怎么办?
在php中,如果出现exec();那么php是先运行完exec中的外部命令,然后继续执行接下来的php语句的。有什么办法让exec自己在那运行,php语句不等待,自己运行下去,让浏览器不用等待。谢谢。
Note:
如何程序使用此函数启动,为了能保持在后台运行,此程序必须将输出重定向到文件或其它输出流。 否则会导致 PHP 挂起,直至程序执行结束。
exec("命令 > null");
来自:http://zhidao.baidu.com/link?url=sqz2GSYfd3fJWE5F7F_2AR15zpj6VNe-9jc1pMNmmj-3MB5KHOnbzOB_9Dls43TqL1zH0PZmdZuN1AXSc_Xj-_
——————————————————————————————————————————————————————————————
请问在php程序里如何非阻塞地执行另一个.php脚本?
我们知道在命令行里可以用php XX.php调用一个php脚本,
但是在php程序里怎样调用另一个.php脚本呢?
要求有两个:
(1) 非阻塞式的。即主程序执行调用其他脚本的语句后,继续执行下面的语句而不阻塞。
(2) 能否把一些主程序的对象作为参数传给被调用的脚本?可以以变通的方式。
exec("php XX.php")函数貌似不行,因为exec()是阻塞的。
请大家想想办法,如何满足以上这两个解决问题?谢谢!
刚看了看Process Control Functions的说明(英文的没看太明白).不过看到了pcntl_fork()复制进程.
这个和Perl的fork()差不多能实现.不过Process Control Functions不能在windows下使用啊,只能在unix或linux下用.比较不爽啊!!!!!
示範 1.pcntl_fork() example
主进程执行当前程序,让子进程去调用另一个php脚本吧,这不就不阻塞了吗!!!
来自:http://bbs.phpchina.com/thread-23687-1-1.html
当PHP作为后端处理需要完成一些长时间处理,为了快速响应页面请求,不作结果返回判断的情况下,可以有如下措施:
一、若你使用的是FastCGI模式,使用fastcgi_finish_request()能马上结束会话,但PHP线程继续在跑。
这个例子输出结果可看到输出program start.后会话就返回了,所以debug那个输出浏览器是接收不到的,而log.txt文件能完整接收到三个完成时间。
二、使用fsockopen的非阻塞模式请求另外的网址
三、使用Gearman
Gearman是一个具有php扩展的分布式异步处理框架,能处理大批量异步任务。
摘自:http://blog.4wer.com/php-nonblock
PHP中实现非阻塞模式:
http://blog.csdn.net/linvo/article/details/5466046
在php中,如果出现exec();那么php是先运行完exec中的外部命令,然后继续执行接下来的php语句的。有什么办法让exec自己在那运行,php语句不等待,自己运行下去,让浏览器不用等待。谢谢。
Note:
如何程序使用此函数启动,为了能保持在后台运行,此程序必须将输出重定向到文件或其它输出流。 否则会导致 PHP 挂起,直至程序执行结束。
exec("命令 > null");
来自:http://zhidao.baidu.com/link?url=sqz2GSYfd3fJWE5F7F_2AR15zpj6VNe-9jc1pMNmmj-3MB5KHOnbzOB_9Dls43TqL1zH0PZmdZuN1AXSc_Xj-_
——————————————————————————————————————————————————————————————
请问在php程序里如何非阻塞地执行另一个.php脚本?
我们知道在命令行里可以用php XX.php调用一个php脚本,
但是在php程序里怎样调用另一个.php脚本呢?
要求有两个:
(1) 非阻塞式的。即主程序执行调用其他脚本的语句后,继续执行下面的语句而不阻塞。
(2) 能否把一些主程序的对象作为参数传给被调用的脚本?可以以变通的方式。
exec("php XX.php")函数貌似不行,因为exec()是阻塞的。
请大家想想办法,如何满足以上这两个解决问题?谢谢!
刚看了看Process Control Functions的说明(英文的没看太明白).不过看到了pcntl_fork()复制进程.
这个和Perl的fork()差不多能实现.不过Process Control Functions不能在windows下使用啊,只能在unix或linux下用.比较不爽啊!!!!!
示範 1.pcntl_fork() example
主进程执行当前程序,让子进程去调用另一个php脚本吧,这不就不阻塞了吗!!!
来自:http://bbs.phpchina.com/thread-23687-1-1.html
当PHP作为后端处理需要完成一些长时间处理,为了快速响应页面请求,不作结果返回判断的情况下,可以有如下措施:
一、若你使用的是FastCGI模式,使用fastcgi_finish_request()能马上结束会话,但PHP线程继续在跑。
这个例子输出结果可看到输出program start.后会话就返回了,所以debug那个输出浏览器是接收不到的,而log.txt文件能完整接收到三个完成时间。
二、使用fsockopen的非阻塞模式请求另外的网址
三、使用Gearman
Gearman是一个具有php扩展的分布式异步处理框架,能处理大批量异步任务。
摘自:http://blog.4wer.com/php-nonblock
PHP中实现非阻塞模式:
http://blog.csdn.net/linvo/article/details/5466046
nginx运行无扩展名或非PHP扩展名文件的配置方法
Php/Js/Shell/Go jackxiang 2014-12-8 13:52
背景:项目之前是在jsp下,现在想切换成php,如何在nginx中配置运行无扩展名的php文件,或运行不是.php扩展名的文件呢?本文为大家介绍的方法,你可以参考下。
根据下面实践好像不行,出现403:"GET /ICU_UP/clientupload.jsp HTTP/1.0" 403 35
于是修改成urlrewrite格式,如下:
/ICU_UP/clientupload.jsp
转写成:
/ICU_UP/clientupload.php
阅读全文
根据下面实践好像不行,出现403:"GET /ICU_UP/clientupload.jsp HTTP/1.0" 403 35
于是修改成urlrewrite格式,如下:
/ICU_UP/clientupload.jsp
转写成:
/ICU_UP/clientupload.php

用IPTABLES封锁某IP的简单用法
Unix/LinuxC技术 jackxiang 2014-12-7 10:37
背景:nginx流量大增,发现有人在刷,于是给通过iptables屏蔽下,没想到没写端口,导致ssh都连接不上,于是否重启开ping -t服务,趁那一瞬间ping通后还没开iptables,立即ssh上去关掉脚本crontab,关掉iptables服务,后修改只屏蔽80端口,如下:iptables -I INPUT -s 210.245.191.162 -p TCP --dport 80 -j DROP; 脚本见:http://jackxiang.com/post/7671/
阅读全文

linux下,Iptable加过滤IP时提示:iptables: Resource temporarily unavailable.的解决办法
Unix/LinuxC技术 jackxiang 2014-12-6 21:39
背景:过滤蜘蛛程序,iptables出现:
root@119.10.6.**:/usr/local/scripts# sh getRidOfSpam.sh
iptables: Resource temporarily unavailable.
iptables: Resource temporarily unavailable.
iptables: Resource temporarily unavailable.
iptables: Resource temporarily unavailable.
iptables: Resource temporarily unavailable.
iptables: Resource temporarily unavailable解决方法
由于线程数目超出了最大值。
root用户下查看oracle用户可用的线程数目
vi /etc/security/limits.conf
显示内容类似如下:
iptables soft nproc 2046
iptables hard nproc 16384
nproc就是"max user processes", 修改soft的数目即可。
lsof | grep iptables | wc -l
PHP的php-fpm进程打开文件居然有这么多,太恐怖了,重启一下先:
lsof | grep iptables | wc -l
21
lsof | grep php | wc -l
12970
lsof | grep nginx | wc -l
776
lsof | grep mysql | wc -l
134
查看打开文件的具体信息:
lsof | grep iptables > iptables.txt
参看:http://blog.itpub.net/12457158/viewspace-753400/
————————————————————————————————————————
ulimit -n 65535 解决,但重启无效的解决办法:
linux下,Iptable加过滤IP时提示:iptables: Resource temporarily unavailable.的解决办法
使用ulimit -a 可以查看当前系统的所有限制值,使用ulimit -n 可以查看当前的最大打开文件数。
新装的linux默认只有1024,当作负载较大的服务器时,很容易遇到error: too many open files。因此,需要将其改大。
使用 ulimit -n 65535 可即时修改,但重启后就无效了。(注ulimit -SHn 65535 等效 ulimit -n 65535,-S指soft,-H指hard)
有如下三种修改方式:
1.在/etc/rc.local 中增加一行 ulimit -n 65535
2.在/etc/profile 中增加一行 ulimit -n 65535
3.在/etc/security/limits.conf最后增加如下两行记录
* soft nofile 65535
* hard nofile 65535
具体使用哪种,试试哪种有效吧,我在 CentOS中使用第1种方式无效果,使用第3种方式有效果,而在Debian中使用第2种有效果
——————————————————————————————————————————————————————————————
一)临时改变:
设置各linux 用户的最大进程数,下面我把某linux用户的最大进程数设为10000个:
ulimit -u 10000
ulimit -a
root@119.10.6.**:~# 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) 46661
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65535 (因为是tcp协议 要打开套接字,要打开文件句柄,而单进程的最大打开文件句柄操作系统是有限制的,默认是1024)
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) unlimited
cpu time (seconds, -t) unlimited
max user processes (-u) 10000
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
二)永久性改变
解除 Linux 系统的最大进程数和最大文件打开数限制:
vi /etc/security/limits.conf
# 添加如下的行
* soft noproc 11000 #软连接
* hard noproc 11000 #硬连接
* soft nofile 4100
* hard nofile 4100
说明:* 代表针对所有用户,noproc 是代表最大进程数,nofile 是代表最大文件打开数
root@119.10.6.**:/usr/local/scripts# sh getRidOfSpam.sh
iptables: Resource temporarily unavailable.
iptables: Resource temporarily unavailable.
iptables: Resource temporarily unavailable.
iptables: Resource temporarily unavailable.
iptables: Resource temporarily unavailable.
iptables: Resource temporarily unavailable解决方法
由于线程数目超出了最大值。
root用户下查看oracle用户可用的线程数目
vi /etc/security/limits.conf
显示内容类似如下:
iptables soft nproc 2046
iptables hard nproc 16384
nproc就是"max user processes", 修改soft的数目即可。
lsof | grep iptables | wc -l
PHP的php-fpm进程打开文件居然有这么多,太恐怖了,重启一下先:
lsof | grep iptables | wc -l
21
lsof | grep php | wc -l
12970
lsof | grep nginx | wc -l
776
lsof | grep mysql | wc -l
134
查看打开文件的具体信息:
lsof | grep iptables > iptables.txt
参看:http://blog.itpub.net/12457158/viewspace-753400/
————————————————————————————————————————
ulimit -n 65535 解决,但重启无效的解决办法:
linux下,Iptable加过滤IP时提示:iptables: Resource temporarily unavailable.的解决办法
使用ulimit -a 可以查看当前系统的所有限制值,使用ulimit -n 可以查看当前的最大打开文件数。
新装的linux默认只有1024,当作负载较大的服务器时,很容易遇到error: too many open files。因此,需要将其改大。
使用 ulimit -n 65535 可即时修改,但重启后就无效了。(注ulimit -SHn 65535 等效 ulimit -n 65535,-S指soft,-H指hard)
有如下三种修改方式:
1.在/etc/rc.local 中增加一行 ulimit -n 65535
2.在/etc/profile 中增加一行 ulimit -n 65535
3.在/etc/security/limits.conf最后增加如下两行记录
* soft nofile 65535
* hard nofile 65535
具体使用哪种,试试哪种有效吧,我在 CentOS中使用第1种方式无效果,使用第3种方式有效果,而在Debian中使用第2种有效果
——————————————————————————————————————————————————————————————
一)临时改变:
设置各linux 用户的最大进程数,下面我把某linux用户的最大进程数设为10000个:
ulimit -u 10000
ulimit -a
root@119.10.6.**:~# 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) 46661
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65535 (因为是tcp协议 要打开套接字,要打开文件句柄,而单进程的最大打开文件句柄操作系统是有限制的,默认是1024)
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) unlimited
cpu time (seconds, -t) unlimited
max user processes (-u) 10000
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
二)永久性改变
解除 Linux 系统的最大进程数和最大文件打开数限制:
vi /etc/security/limits.conf
# 添加如下的行
* soft noproc 11000 #软连接
* hard noproc 11000 #硬连接
* soft nofile 4100
* hard nofile 4100
说明:* 代表针对所有用户,noproc 是代表最大进程数,nofile 是代表最大文件打开数
背景:
国内新网的云v5的vps在ping出现请求超时,对方技术说是网络流量超了,装了很多看网路是否真的超了5M,查看:
http://jackxiang.com/post/7671/ 于是否装一个看看并发数的,看流量到底在哪儿出现超了5M/s的,于是安一个status很有必要。
修改nginx配置文件,添加监控状态配置,在nginx.conf的server块中添加如下代码:
这段代码是加在默认的server里的,
假设默认server的配置为
listen 127.0.0.1:80;
server_name 127.0.0.1;
那么访问nginx的状态,就可以通过 curl 127.0.0.1/nginx_status访问了
阅读全文
国内新网的云v5的vps在ping出现请求超时,对方技术说是网络流量超了,装了很多看网路是否真的超了5M,查看:
http://jackxiang.com/post/7671/ 于是否装一个看看并发数的,看流量到底在哪儿出现超了5M/s的,于是安一个status很有必要。
修改nginx配置文件,添加监控状态配置,在nginx.conf的server块中添加如下代码:
这段代码是加在默认的server里的,
假设默认server的配置为
listen 127.0.0.1:80;
server_name 127.0.0.1;
那么访问nginx的状态,就可以通过 curl 127.0.0.1/nginx_status访问了

[转]PHP扩展如何用gdb进行调试
Php/Js/Shell/Go jackxiang 2014-12-5 14:36
扩展编译好用,通过php编码测试报“段错误",如果是c语言都是用gdb进行设置,那php扩展要如何进行调试呢?搜索了下,虽然是php扩展但是core是php 的core不是单个so扩展的coredump
这里使用ulimit -c unlimited来开启core文件,使用gdb来对core文件进行调试演示一下。
阅读全文
这里使用ulimit -c unlimited来开启core文件,使用gdb来对core文件进行调试演示一下。

[转]malloc/free 的开销,如何去掉这种开销?忘记free内存泄漏怎么办?
Unix/LinuxC技术 jackxiang 2014-12-4 00:16
背景:C语言里重新分配及释放结构体会产生一些开销,可能导致巨大的性能瓶颈。解决这个问题的一个办法是为分配的结构体单独维护一个表。当用户不需要某个结构体实例时,将其返回结构体池中。当我们需要某个实例时,从结构体池中获取一个对象。如果池中没有可用的元素,我们就可以动态分配一个实例。这种方法高效地维护一个结构体池,能按需重复使用动态内存。
一般的malloc实现,对一块已分配的内存,都有两个机器字的簿记,甚至更多。如果不需要排错,理论上讲,只需要一个字长的额外开销,用来记录这块内存的尺寸(放在intptr[-1]处是个好主意)。
为什么需要这个开销呢?因为free传入的只是个指针,它不知道要释放多大的内存,因此free内部必须通过某种方式来获得这块内存的尺寸。
可以想象,如果用 malloc/free 来作为一个关联数组(map)的分配器,要浪费不少内存。不过好在实际数据的尺寸往往比额外消耗要大很多,相比起来,浪费的比例不算很大,况且现在内存还很便宜。
其实,打造一个高效的分配器并不难,难的是它的适用范围(多线程?cell尺寸,chunk尺寸,对齐,排错...),如果可以忍受这些缺陷,或者说是限制,还是比较值得的。下一步就是它的灵活性——让它可以更加容易集成进其它系统。
对于C标准库,如果能增加一个/一族这样的分配器,还是很有价值的。从理论上讲,只要free时多传一个size参数,就可以完全去掉额外的开销。这样两个函数就可以做到:
这样做还有一个额外的好处,就是可以更好地对齐,假定程序需要按32字节对齐,malloc/free 就至少需要32字节做簿记,如果再加上内存越界检测,就需要64字节。salloc/sfree则只需要将分配的内存对齐到32字节边界即可。
但是这对程序的正确性要求很高,malloc/free中,内存越界检测可以很容易实现,而salloc/sfree就完全做不到(除非增加额外簿记)。一个好主意是可以在debug版中加入这些差错功能,而在release版中去掉。
更好(确切地讲应该是更灵活)的方案是,实现一个
而让 salloc/sfree简单地作为 mpool 的包装。
gcc的std::allocator基本上是按这样的方式实现的,只不过,它的size参数,大多数时刻是自动传递的(知道具体的class/struct,也就知道它的尺寸)。实现方式上,使用 size_aligned/align 作为索引去访问特定尺寸的mempool,一个 mempool 是多个链表串起来的大chunk,每个chunk内部是链表穿起来的cell。这也许是最好的实现方式了,除了节省的额外空间开销,时间开销上,如果不考虑加锁,一次alloc平均可以在10时钟周期内完成,dealloc用的时间更短。相比之下malloc/free耗的时间也要多得多。
原文来自:http://blog.csdn.net/whinah/article/details/4693828
如何减少频繁分配内存(malloc或者new)造成的内存碎片?
高性能之内存池(频繁使用malloc和new会降低性能)
内存池(Memory Pool)是一种内存分配方式。 通常我们习惯直接使用new、malloc等API申请分配内存,这样做的缺点在于:由于所申请内存块的大小不定,当频繁使用时会造成大量的内存碎片并进而降低性能。内存池则是在真正使用内存之前,先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存。这样做的一个显著优点是尽量避免了内存碎片,使得内存分配效率得到提升。
(1)针对特殊情况,例如需要频繁分配释放固定大小的内存对象时,不需要复杂的分配算法和多线程保护。也不需要维护内存空闲表的额外开销,从而获得较高的性能。
(2)由于开辟一定数量的连续内存空间作为内存池块,因而一定程度上提高了程序局部性,提升了程序性能。
(3)比较容易控制页边界对齐和内存字节对齐,没有内存碎片的问题。
(4)当需要分配管理的内存在100M一下的时候,采用内存池会节省大量的时间,否则会耗费更多的时间。
(5)内存池可以防止更多的内存碎片的产生
(6)更方便于管理内存
转自:http://blog.sina.com.cn/s/blog_6abf2c040101fj3f.html
忘记free内存泄漏怎么办?
linux C内存泄露检测实现及内存泄露检测的一般方法
linux中,由于使用malloc或alloc而没有free掉申请的内存,就会造成内存的泄露。通常,来讲为了避免内存泄露的情况出现,一般要求,我们尽量的malloc之后,调用free。但是总会有忘记free的时候啊。一般可以有如下几种方式来避免内存泄露:
1) 使用智能指针,这个在C++中较为常见;
2) 使用内存池;
3) 自己封装一层malloc/free等等。当申请内存时,将申请信息放入到一个已分配内存信息链表里面。free时,删除对应的信息表的节点。在程序执行结束前,扫瞄该信息表,若还存在信息节点,那么该节点记录的就是泄露的内存信息。若链表为空,那就是说没有发生内存泄露;
4)使用检测工具检测内存泄露,进而修补程序,这样的工具有比如Valgrind等等。
摘录自:http://www.xuebuyuan.com/1764051.html
一般的malloc实现,对一块已分配的内存,都有两个机器字的簿记,甚至更多。如果不需要排错,理论上讲,只需要一个字长的额外开销,用来记录这块内存的尺寸(放在intptr[-1]处是个好主意)。
为什么需要这个开销呢?因为free传入的只是个指针,它不知道要释放多大的内存,因此free内部必须通过某种方式来获得这块内存的尺寸。
可以想象,如果用 malloc/free 来作为一个关联数组(map)的分配器,要浪费不少内存。不过好在实际数据的尺寸往往比额外消耗要大很多,相比起来,浪费的比例不算很大,况且现在内存还很便宜。
其实,打造一个高效的分配器并不难,难的是它的适用范围(多线程?cell尺寸,chunk尺寸,对齐,排错...),如果可以忍受这些缺陷,或者说是限制,还是比较值得的。下一步就是它的灵活性——让它可以更加容易集成进其它系统。
对于C标准库,如果能增加一个/一族这样的分配器,还是很有价值的。从理论上讲,只要free时多传一个size参数,就可以完全去掉额外的开销。这样两个函数就可以做到:
这样做还有一个额外的好处,就是可以更好地对齐,假定程序需要按32字节对齐,malloc/free 就至少需要32字节做簿记,如果再加上内存越界检测,就需要64字节。salloc/sfree则只需要将分配的内存对齐到32字节边界即可。
但是这对程序的正确性要求很高,malloc/free中,内存越界检测可以很容易实现,而salloc/sfree就完全做不到(除非增加额外簿记)。一个好主意是可以在debug版中加入这些差错功能,而在release版中去掉。
更好(确切地讲应该是更灵活)的方案是,实现一个
而让 salloc/sfree简单地作为 mpool 的包装。
gcc的std::allocator基本上是按这样的方式实现的,只不过,它的size参数,大多数时刻是自动传递的(知道具体的class/struct,也就知道它的尺寸)。实现方式上,使用 size_aligned/align 作为索引去访问特定尺寸的mempool,一个 mempool 是多个链表串起来的大chunk,每个chunk内部是链表穿起来的cell。这也许是最好的实现方式了,除了节省的额外空间开销,时间开销上,如果不考虑加锁,一次alloc平均可以在10时钟周期内完成,dealloc用的时间更短。相比之下malloc/free耗的时间也要多得多。
原文来自:http://blog.csdn.net/whinah/article/details/4693828
如何减少频繁分配内存(malloc或者new)造成的内存碎片?
高性能之内存池(频繁使用malloc和new会降低性能)
内存池(Memory Pool)是一种内存分配方式。 通常我们习惯直接使用new、malloc等API申请分配内存,这样做的缺点在于:由于所申请内存块的大小不定,当频繁使用时会造成大量的内存碎片并进而降低性能。内存池则是在真正使用内存之前,先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存。这样做的一个显著优点是尽量避免了内存碎片,使得内存分配效率得到提升。
(1)针对特殊情况,例如需要频繁分配释放固定大小的内存对象时,不需要复杂的分配算法和多线程保护。也不需要维护内存空闲表的额外开销,从而获得较高的性能。
(2)由于开辟一定数量的连续内存空间作为内存池块,因而一定程度上提高了程序局部性,提升了程序性能。
(3)比较容易控制页边界对齐和内存字节对齐,没有内存碎片的问题。
(4)当需要分配管理的内存在100M一下的时候,采用内存池会节省大量的时间,否则会耗费更多的时间。
(5)内存池可以防止更多的内存碎片的产生
(6)更方便于管理内存
转自:http://blog.sina.com.cn/s/blog_6abf2c040101fj3f.html
忘记free内存泄漏怎么办?
linux C内存泄露检测实现及内存泄露检测的一般方法
linux中,由于使用malloc或alloc而没有free掉申请的内存,就会造成内存的泄露。通常,来讲为了避免内存泄露的情况出现,一般要求,我们尽量的malloc之后,调用free。但是总会有忘记free的时候啊。一般可以有如下几种方式来避免内存泄露:
1) 使用智能指针,这个在C++中较为常见;
2) 使用内存池;
3) 自己封装一层malloc/free等等。当申请内存时,将申请信息放入到一个已分配内存信息链表里面。free时,删除对应的信息表的节点。在程序执行结束前,扫瞄该信息表,若还存在信息节点,那么该节点记录的就是泄露的内存信息。若链表为空,那就是说没有发生内存泄露;
4)使用检测工具检测内存泄露,进而修补程序,这样的工具有比如Valgrind等等。
摘录自:http://www.xuebuyuan.com/1764051.html
背景:
一)在Nginx上设置禁止通过IP访问服务器,只能通过域名访问,这样做是为了避免别人把未备案的域名解析到自己的服务器IP而导致服务器被断网
,这才是关键。
二)很多nginx的配置,好像都忽略了ip直接访问web的问题,不利于SEO优化,所以我们希望可以避免直接用IP访问网站,而是域名访问。
阅读全文
一)在Nginx上设置禁止通过IP访问服务器,只能通过域名访问,这样做是为了避免别人把未备案的域名解析到自己的服务器IP而导致服务器被断网
,这才是关键。
二)很多nginx的配置,好像都忽略了ip直接访问web的问题,不利于SEO优化,所以我们希望可以避免直接用IP访问网站,而是域名访问。
