使用apache 的ab做压力测试时,当压力过大,例如请求1000000次,在没有执行完就报apr_poll:The timeout specified has expired错误,解决办法,使用-k(发送keep-alive指令到服务器端),同时修改web服务器下的/etc/sysctl.conf,在里面添加如下内容:
net.ipv4.netfilter.ip_conntrack_max = 3276800
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_orphan_retries = 1
net.ipv4.tcp_fin_timeout = 25
net.ipv4.tcp_max_orphans = 8192
net.ipv4.ip_local_port_range = 32768 61000
如果已经存在,试着加大net.ipv4.netfilter.ip_conntrack_max的值,然后使用
sysctl -p /etc/sysctl.conf
使其生效。
在centos下安装了mongodb,使用SecureCRT连接centos后,使用mongo来操作mongodb,在shell使用退格键时出现乱七八糟的字符,造成这个问题原因跟SecureCRT配置有关,修改设置为:选项 –> 会话选项 –> 终端 –> 仿真 –> 终端中选择linux 即可。详细如下图:
在一个备份脚步中执行了删除7天前的旧备份文件的命令,备份文件存放在/home/backups/files/下,命令如下:
find /home/backups/files/ -mtime +6 -exec rm -rf {} \;
开始时候运行正常,一段时间后发现没有备份了,查看下来,发现/home/backups/files/文件都不存在了。原来是因为find写法有问题,find /home/backups/files/ -mtime +6 出来的结果会包含/home/backups/files/目录(当files目录的创建时间超过7天),是自己想当然的以为在目录后面加了“/”就只查找该目录下的文件,测试下来,find /home/backups/files/ -mtime +6和find /home/backups/files -mtime +6的结果一致。知道问题所在了,解决问题就好办了,只需要在后面加个星号(*)通配符就行了,如下:
find /home/backups/files/* -mtime +6 -exec rm -rf {} \;
在mysql中使用order by对存储了中文信息的字段,默认出来的结果并不是按汉字拼音的顺序来排序,要想按汉字的拼音来排序,需要把数据库的字符集设置为UTF8,然后在order by 时候强制把该字段信息转换成GBK,这样出来的结果就是按拼音顺序排序的。例如:
SELECT * FROM table_name ORDER BY CONVERT(column_name USING gbk);
要想知道window xp系统从上次启动到现在共运行了多长时间,可以在命令行中使用命令:systeminfo,该命令的输出里面有一行“系统启动时间”就是指系统从开启到现在共运行的时间,另外可以通过 net statistics WORKSTATION 命令获取本次系统启动的时间。
当访问某个链接时浏览器是直接把内容显示出来还是出现下载提示框,这个跟当前页面的content-type有关,例如文本、html、css、图片等会直接显示出来,rar、zip等会出现下载提示框。如果需要把文本、图片不直接显示在浏览器中,可以通过人为设置其content-type。tomcat中配置如下:
<mime-mapping>
<extension>txt</extension>
<mime-type>application/octet-stream</mime-type>
</mime-mapping>
<mime-mapping>
<extension>jpg</extension>
<mime-type>application/octet-stream</mime-type>
</mime-mapping>
对于如上配置,当访问扩展名txt或jpg的资源时就出现下载提示框,如果只需要对某些提到的资源让其出现下载提示框,上述配置就不行了,解决的方法是在资源的response头中设置content-type即可,例如:
php 中
header("Content-type:application/octet-stream");
header('Content-Disposition: attachment; filename="downloaded.txt"');
java 中
response.setContentType("application/octet-stream");
resp.setHeader("Content-Disposition", "attachment;filename="downloaded.txt");
如果需要为下载设置一个保存的名字,可以用Content-Disposition属性来指定。
在linux下可以用mysql命令登陆连接到mysql服务器,如果这时需要执行shell命令,例如查看某个目录下的文件列表,其实不需要退出mysql客户端,只需要在mysql提示符下输入system或\! 再加上系统命令即可。
下载地址:memcached-tool ,用法命令:
perl memcached-tool server_ip:prot display
perl memcached-tool server_ip:prot dump
perl memcached-tool server_ip:prot stats
perl memcached-tool server_ip:prot move 7 9
stats 输出说明:
pid memcache服务器的进程ID
uptime 服务器已经运行的秒数
time 服务器当前的unix时间戳
version memcache 版本
pointer_size 当前操作系统的指针大小(32位系统一般是32bit)
rusage_user 进 程的累计用户时间
rusage_system 进程的累计系统时间
curr_items 服务器当前存储的items数量
total_items 从服务器启动以后存储的items总数量
bytes 当前服务器存储items占用的字节数
curr_connections 当前打开着的连接数
total_connections 从服务器启动以后曾经打开过的连接数
connection_structures 服务器分配的连接 构造数
cmd_get get命令(获取)总请求次数
cmd_set set 命令(保存)总请求次数
get_hits 总命中次数
get_misses 总未命中次数
evictions 为获取空闲内存而删除的items数
(分配给memcache的空间用满后需要删除旧的items来得到空间分配给新的items)
bytes_read 总读取字 节数(请求字节数)
bytes_written 总发送字节数(结果字节数)
limit_maxbytes 分配给memcache的内存大小(字节)
threads 当前线程数
在centos下,开机后会自动执行/etc/rc.local中的命令,平时启动tomcat的命令为tomcat_home/bin/startup.sh或tomcat_home/bin/catalina.sh start,当直接把他们任何一个加入到/etc/rc.local中,重启机器后发现tomcat并没有启动。原因是开机时java的环境还没有设置好,故自己写一个脚本,先设置java环境,然后在启动,脚本如下:
export JAVA_HOME=/usr/local/jdk1.6.0_30
export PATH=$JAVA_HOME/bin/:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$CLASSPATH
export CATALINA_HOME=/usr/local/tomcat-6.0.35/
/usr/local/tomcat-6.0.35/bin/catalina.sh start
假设保存成一个名为auto-startup.sh的文件存放在/usr/local/tomcat-6.0.35/bin下,然后在/etc/rc.local加入/usr/local/tomcat-6.0.35/bin/auto-startup.sh即可。注意:需要设置auto-startup.sh有执行权限。
在java web 应用中使用dbcp做为连接池,当数据库重启或数据库连接超过设置的最大timemout时间,数据库会强行断开已有的链接,此时当web程序访问数据库时就会出现错误,大致的错误信息java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost,原因是数据库这边已有的连接强行断开,而连接池中不知道已经断开,还是从连接池取出数据库连接交给程序去执行数据库操作,所以导致出错。
mysql的默认最大timeout时间是8小时,对空闲超过8小时的数据库连接会强行断开。timeout有两种,一个是非交互式的最大等待时间wait_timeout,另一个是交互式的最大等待时间interactive_time,交互连接如mysql gui tool中的连接。一般情况下interactive_timeout的设置将要对你的web 应用没有多大的影响。wait_timeout的时间设置太小话会导致连接关闭很快,从而使一些持久连接不起作用,反之设置过大,容易造成连接打开时间过长,在show processlist时,能看到太多的sleep状态的连接,从而造成too many connections错误。修改wait_timeout可以在my.cnf的mysqld段中设置。
可以通过dbcp的配置来解决上述的报错。可以用两种方式。
方式一:通过设置validationQuery,例如:
<property name="validationQuery">
<value>select 1</value>
</property>
使用上述配置,连接池在返回数据库连接给申请者时会多执行一条sql语句来确保该连接的有效性。如果数据库方已经关闭了,连接池会重新建立连接并返回给申请者。通过测试似乎跟testWhileIdle没有关系,不管其是true或false都正常工作。
方式二:通过配置timeBetweenEvictionRunsMillis和minEvictableIdleTimeMillis,例如:
<property name="minEvictableIdleTimeMillis">
<value>60000</value>
</property>
<property name="timeBetweenEvictionRunsMillis">
<value>10000</value>
</property>
在构造GenericObjectPool [BasicDataSource在其createDataSource () 方法中也会使用GenericObjectPool]时,会生成一个内嵌类Evictor,实现自Runnable接口。如果timeBetweenEvictionRunsMillis大于0,每过 timeBetweenEvictionRunsMillis毫秒Evictor会调用evict()方法,检查连接池中的连接的闲置时间是否大于 minEvictableIdleTimeMillis毫秒(_minEvictableIdleTimeMillis小于等于0时则忽略,默认为30分钟),是则销毁此对象,然后调用ensureMinIdle方法检查确保池中对象个数不小于_minIdle。如果连接池的连接数小于最小空闲连接数,则创建数据库连接,同时检查连接池的连接是否小于maxIdle,是则把刚创建的连接放入连接池中,否则销毁此对象。
上述方式一能确保不出现本文开头提到的错误,但是不好的方面是每次执行sql时都会额外执行一条提供的validationQuery sql;第二种方式在数据库重启后minEvictableIdleTimeMillis毫秒前访问web应用,连接数据库使用的还是连接池中老的连接,所以还会出现上述的错误,timeBetweenEvictionRunsMillis和minEvictableIdleTimeMillis也不宜设置过小,会加重系统开销。根据具体情况来考虑使用哪种方式。对于数据库可能会经常重启,web应用和数据库机器的网络连接不稳定,可以采取第一种方式,否则使用第二种。由于mysql的默认最大空闲时间8小时,所以只要把minEvictableIdleTimeMillis设置小于此值即可。例如配置每十分钟检查超过空闲一个小时的连接
<property name="minEvictableIdleTimeMillis">
<value>3600000</value>
</property>
<property name="timeBetweenEvictionRunsMillis">
<value>600000</value>
</property>