技术开发 频道

开发实战:舍得网44587行代码开发经验

  问题三:

  linux下的too many open files错误,这个问题比较严重,AS4默认打开文件数是1024,如果超过这个数,resin就自动down掉了,非常恶心。解决办法如下:

echo 65536 > /proc/sys/fs/file-max
编辑/etc/sysctl.conf 文件,编辑行 fs.file-max = 65536
编辑文件/etc/security/limits.conf,增加行 * - nofile 65536
用ulimit -a 查看,如果看到行open files (-n) 65536就说明对了

 

  问题四:

  内存泄露,表现出来的特征是CPU占到99.9%,内存由10%左右经过几个小时后慢慢涨到50%,最后死掉。做java的人知道,这个问题非常痛苦,而且没有很好的解决办法,因为直接看代码很难看出来。我原来一直以为问题会出现在缓存上,但仔细想想apache的LRUMap不至于产生内存泄露,尤其我设置了LRUMap最大长度只有10000,10000个内存对象能有多大,后来发现是SmartUpload的问题,改成apache的FileUpload子项目就可以了。另外,我在设置jvm参数时增加了-Xmx2048m -Xms2048m -Xmn768m -Xss512k -XX:+UseParallelGC -XX:ParallelGCThreads=4 -XX:+UseParallelOldGC -XX:+UseAdaptiveSizePolicy这些参数,可以回收年老区的内存,现在比较稳定,一般内存占到27%左右就不会再涨了,可能这些参数还不是最优的,有待探索。另外查找内存泄露的软件JProbe我也玩了玩,的确看出其他代码没有明显内存泄露。

  修正:上面的参数配置狗P用都没有,内存总是一直在涨。我还尝试了用其他不同方法去回收内存,结果都不太好使,直接用jvm默认的回收方式是最好的,也就是只配置两个参数-Xmx768M -Xms768M效果优秀,这样java才真的可以一次性回收几百兆的内存。

  问题五:

  搜索分词。一个用户在用舍得网时反映,看到有“啤酒”和“茅台酒”,为什么搜“酒”搜不出来,原因很简单,“啤酒”和“茅台酒”是单独一个词,lucene写入的时候没有再把它拆开,所以必须要搜“啤酒”或“茅台酒”才能搜出来,这在技术上合理,但是用户觉得不合理。所以我改进了搜索算法,把中国3万多个汉字也加到词库中,而且在写入和搜索时用不同的分词算法,如“我喜欢喝啤酒”在写入时会分成“我+喜欢+喝+啤酒+喜+欢+啤+酒”,而在搜索时这句话会被分词为“我+喜欢+喝+啤酒”,这样,用户搜“啤酒”能搜到,搜“酒”也能搜到,而对应另外一句话“这人啤气不好,总喝酒”搜“啤”和“酒”都能搜到,但搜“啤酒”却搜不到,似乎有点意思。但是这么分词也会有点小问题,就是搜索的结果不太人性化(我的中文词库加成语加汉字共50多万个,比起一般网上十来二十万要丰富得多,不过这没什么大用)。

  问题六:

  URL链接“静态化”。本想直接用apache的URL Rewrite来实现,发现不太可能,于是改用urlrewirte实现,配置没什么难度,但是要注意resin的web-app里须增加一行配置 ,这样apache才会把htm结尾的请求转交给resin,否则apache报404错误,这在一般structs项目中都会提到。现在看到的舍得网http://shedewang.com/pg_5_c_2_index.htm,其实就是http://shedewang.com/index.jsp?pg=5&c=2,呵呵,没什么特别的。

  问题七:

  IE6/IE7/FF的适配,这体现在许多细节上,如FF的回车事件捕获,IE7的href=#页面会移动等等问题上,多测几次,多上网找找也就都解决了。很多人开发网站似乎不太会管FF能不能看,但好歹我也在SP混过几年,做WAP的时候要适配10来款手机,做web适配三五个浏览器不算什么。

  问题八:

  linux自身的bug。远程连接mysql时有时mysql似乎会重起,这个问题似乎是linux自身的bug,好像和解析有点关系导致mysql崩溃。解决办法:启动mysql增加一个参数,如下:

/usr/local/mysql/bin/mysqld_safe --user=mysql --skip-name-resolve &
0
相关文章