4月 05

越来越慢的java问题

  新上线了一个接口,但是导致整个服务越来越慢。之前所做的压力测试结果也不错,五百并发只要十几秒。因为没有做疲劳测试,当前看来还是有问题。但是具体哪里出了问题还不清楚,需要详细查看。我也不是java开发所以只能是协助分析,先找了个分析工具看看导致瓶颈的主要原因。下载http://java.net/projects/visualvm/downloads/download/release134/visualvm_134.zip,解压缩后直接使用。
  解压缩后在文件夹的bin目录下有两个可执行文件,一个是exe的windows下使用的,另一个是linux下使用的。直接将解压的目录上传到linux操作系统中。准备运行,需要注意的是,linux下运行需要用到图形化,所以要用putty这类的小工具需要开启X11。
  启动# sh visualvm。在左侧可以看到已经启动的容器,打开resin服务。等待运行一段时间如图:
  经过更长时间对比,确定应该是内存泄露问题。因为内存值不断在增长,直至将系统资源占满。正常的接口,进行压力测试时,内存和CPU的值均比较平衡。具体问题使用sampler进行分析,应该是字符转换存在问题,并且没有释放。我直接反馈给开发人员,具体问题就不清楚了,在此做个简单记录。

3月 09

云技术和物联网之我见

  云技术和物联网是当下炒的比较热门的两个技术,我也随波逐流进行了肤浅的学习。本来没有打算写什么,但是在实际中遇到很多人对技术的认识我和我的认知差距很大,所以我觉得有必要通过写字,来记录一下当前的想法,以便后期反省使用。
  首先看看什么是云,云到现在也没有很明确的定义,我把当前所见过对云的定义总结一下。就是大规模计算机集群,用户可以根据自己需要资源量来进行定制化使用。随之而来的问题是,google、百度、亚马逊、雅虎等在很多年前都已部署了集群,为什么没有提出云概念?电信公司使用大规模计算机进行服务,我们按照需要进行使用付费,为什么通信行业没有提出云的概念?我的答案,电信行业的收费模式已经形成,并且被公认。而以互联网为基础的大型公司有剩余的网络、设备和技术资源,可以简单的包装,便能为当前需要但又不是长期需要的客户进行服,这种服务需要的是技术的噱头和简单的盈利方案,云产生了。云的技术已经在大型公司相当完善,所以云应该和传统的叫法结合。云技术是整体名称,细分可以分为云计算、云存储、云流量、云安全等等。云计算,是以cpu为计费主体的方案。云存储是以存储为主体的方案,当然存储是分布式存储,也必须用到计算的部分,但计算起到的作用是为存储选址的作用。举个实际的例子,cpu就是车间,cpu产出信息,车间产出物品,cpu产出存在磁盘,车间产出存在仓库。可以通过车间产出运输可以找到物品的存放仓库,但是仓库可以转给这个车间用,也可以是其它的仓库。车间和仓库都属于一个厂,但是仓库绝对不是车间下层的一部分。如果还要具体讨论,还需要了解,什么叫数据,什么叫信息、什么叫计算这些基础知识就不废话了,有空查查看。如果大家很熟悉分布式那云基本就没有问题了,我对云的热情也减少了不少。
  再来说物联网。物联网的定义很清晰,通过射频识别(RFID)、感应器、全球定位系统、控制器、短距离通信技术,按约定的协议,把任何物品与互联网相连接,从而达到人与物,物与物之间的连接。物联网的传出是以所有的通信网络为基础,是信息交换和通信的一种网络概念。当前的ETC通道、移动医疗、远程视频等都属于物联网的范畴。物联网正在高速的发展,中国也在大力的打造物联网,所以物联网应该是发展的趋势。在此就不费唇舌了。

2月 24

resin 展示静态页面中文乱码

  编辑了一个html,页面编码使用utf-8,保存也使用utf-8,本地直接用浏览器测试正常。但是上传到centos下resin-pro-4.0.6的中文就乱码了。将页面放到centos下的nginx中,中文显示正常。所以确定是resin展示的问题。

  修改resin配置 conf/app-default.xml

原始配置如下:


    
      false
      1024
      true
    
    
  

增加配置

utf-8

,修改结果如下:


    
      utf-8
      false
      1024
    
    
  

重启resin服务,浏览html正常。
注:清除浏览器的页面缓存后测试

2月 03

猴子们的问题

【2012 张子萌】
其实此问题比较容易,在网上也有很多版本。为了学习我自己做了一下,在CeotOS5.4系统编译调试通过。

猴子分桃子:有5只猴子在海边发现一堆桃子,决定第二天来平分.第二天清晨,第一只猴子最早来到,它左分右分分不开,就朝海里扔了一只,恰好可以分成5份,它拿上自己的一份走了.第2,3,4,5只猴子也遇到同样的问题,采用了同样的方法,都是扔掉一只后,恰好可以分成5份.问这堆桃子至少有多少只.

#include

main ()
{
int monkeys,peach=0,all_peach;
do
{
peach=peach+1;
all_peach=peach;
for (monkeys=5;monkeys>0;monkeys–)
{
all_peach=all_peach*5+1;
}
}while (((all_peach-1)/2)==0);
printf(“==>%dn”,all_peach);
}

结果如下:
# ./test
==>3906

猴子吃桃子:猴子第一天摘下N个桃子,当时就吃了总数的一半,还不过瘾,
就又吃了一个。第二天又将剩下的桃子吃掉一半,又多吃了一个。
以后每天都吃前一天剩下的一半零一个。
到第9天在想吃的时候就剩一个桃子了,求第一天共摘下来多少个桃子?

#include

main ()
{
int days,peach=1;
for(days=9;days>0;days–)
{
peach=(peach+1)*2;
}
printf(“==>%d”,peach);
}

结果如下:
# ./test
==>1534

猴子选大王:n只猴子围坐成一个圈,按顺时针方向从1到n编号。
然后从1号猴子开始沿顺时针方向从1开始报数,报到m的猴子出局,
再从刚出局猴子的下一个位置重新开始报数,如此重复,直至剩下一个猴子,
它就是大王。

#include

main ()
{
int monkeys,num;
int loops,kings;
int i,j=-1;
printf(“pleas input monkey amonut:”);
scanf(“%d”,&monkeys);
printf(“pleas input num:”);
scanf(“%d”,&num);
int m_k[num];
for (i=0;i {
m_k[i]=1;
}
kings=monkeys;
//start choose king
do
{
loops=num;
while(loops>0)
{
j=j+1;
if (j>monkeys-1) j=0;
if (m_k[j]==1)
loops=loops-1;
}
m_k[j]=0;
kings=kings-1;
}while(kings>1);
for (i=0;i {
printf(“%d “,m_k[i]);
}
}

结果如下:
# ./test
pleas input monkey amonut:6
pleas input num:2
0 0 0 0 1 0

10月 22

php python node.js 简单循环累加计算速度测试

【张子萌 www.simonzhang.net 2012-4-1】

之前简单做了一下node.js和python的“hello ***”的页面测试,也做了循环的测试,本次主要是增加了java的语言,go语言。主要是想看一下主流四种脚本的速度java、python、php、c语言。均使用for循环进行简单的累加测试。个人技能有限所以只做了简单测试做参考。

实验环境使用linux 64位服务器,操作系统为contos 5.4,php版本5.1.6,python版本为2.6.6,node.js版本为0.4.12,java版本为1.6.0_03,gcc 版本 4.1.2 2008070,go语言为1.0.2。
一、脚本编写
php脚本
# cat test.php

python脚本
# cat test.py

#!/bin/env python
#-*- coding:utf-8 -*-
def main():
    j = 0;
    for i in xrange(10000000):
        j=j+i
    print j

if __name__=="__main__":
    main()

node.js脚本
# cat test.js

var j=0;
for (i = 0; i < 10000000; i++ ) {
   j=j+i
}
    console.log(j);

Java代码:
# cat Test.java

public class Test {
public static void main(String[] args) {
          long n = 0;
          for (int i = 0; i < 10000; i++) {
               n=n+i;
          }
          System.out.println(n);
     }
}

C语言,使用gcc编译,编译两种结果,一种是直接编译的,一种是优化编译的。

#include 
#include 
main()
{
    long i,j=0;
    for (i=0 ; i<10000000 ; i++)
       j=j+i;
    printf("%ld\n",j);
}

go语言代码

package main

import "fmt"

func main() {
    var sum,i int64
    sum=0
    for i=0;i<10000000;i++{
        sum+=i
    }
    fmt.Printf("%d",sum)
}

二、运行结果
使用time命令对程序运行时间进行统计

以下是循环一千万次的累加测试结果。

参数 C语言直接编译 C语言优化编译 go Node.js Python PHP Java
Real 0.024s 0.001s 0.011s 0.420s 1.055s 1.429s 0.087
User 0.023s 0.000s 0.011s 0.401s 1.046s 1.423s 0.067
sys 0.001s 0.001s 0.000s 0.019s 0.009s 0.007s 0.015

以下是循环一万次的累加测试结果

参数 C语言直接编译 C语言优化编译 go Node.js Python PHP Java
Real 0.001s 0.001s 0.004s 0.090s 0.027s 0.014s 0.087
User 0.000s 0.001s 0.003s 0.080s 0.022s 0.007s 0.041
sys 0.001s 0.000s 0.002s 0.010s 0.006s 0.007s 0.017

三、结论
从简单的测试来看,c语言不是一般的快,大数据计算情况下node.js速度最快,java次之,python和php比慢。但是如果是少量计算时php效果还是很不错。但是实际应用中,还需要调用各种函数和各方面的资源,并不能以一个空框架下的for来判断。每种语言都会有自己擅长的一方面,速度快与慢,还与编写的技巧性有关。学好每一步,认认真真踏实的做就好了。