请教一个让我很头疼的问题!java编写的服务器程序影响了CPU时钟!

19 views
Skip to first unread message

w

unread,
May 26, 2009, 9:01:02 PM5/26/09
to 高性能网络编程邮件列表
公司有一些用j2se 1.5开发的服务器程序,运行在windows 2003 server下面,
主要是接收大量终端的udp包,然后解码、转发、存数据库等操作。
程序用j2se1.5的concurrent包提供的多线程池,每收到一条udp数据都生成一个线程,
放到线程池中处理,基本不涉及到线程同步的问题。
麻烦来了!
当终端数量达到2000左右、每秒处理的数据量达到200条udp包左右的时候,操作系统的
时钟会明显变快(两台服务器对比可以明显看出来),当操作系统的时间快了大概20秒左右的
时候,时间又会自动跳回到正常时间,然后继续上面的现象。
服务器程序不启动的时候,操作系统的时间是正常的。
可以肯定是java程序影响了操作系统,但是什么原因造成的就不知道了。
网上也搜不到相关的信息。头疼!

目前的解决方式的在服务器上跑一个小软件,每秒中与另外一台时间正常的服务器同步时间。

Hailong Shu

unread,
May 26, 2009, 9:10:07 PM5/26/09
to dev4s...@googlegroups.com
从描述上看,不一定是JAVA的原因。服务器配置一个NTP服务把,这样就不用担心主机时间问题了。


 
2009/5/27 w <aga...@gmail.com>

Lyman

unread,
May 26, 2009, 9:23:22 PM5/26/09
to dev4s...@googlegroups.com
w 写道:

> 公司有一些用j2se 1.5开发的服务器程序,运行在windows 2003 server下面,
> 主要是接收大量终端的udp包,然后解码、转发、存数据库等操作。
> 程序用j2se1.5的concurrent包提供的多线程池,每收到一条udp数据都生成一个线程,
> 放到线程池中处理,基本不涉及到线程同步的问题。
> 麻烦来了!
> 当终端数量达到2000左右、每秒处理的数据量达到200条udp包左右的时候,操作系统的
> 时钟会明显变快(两台服务器对比可以明显看出来),当操作系统的时间快了大概20秒左右的
> 时候,时间又会自动跳回到正常时间,然后继续上面的现象。
> 服务器程序不启动的时候,操作系统的时间是正常的。
> 可以肯定是java程序影响了操作系统,但是什么原因造成的就不知道了。
windows 下面需要啥级别权限才能改系统时间?服务器程序是以什么权限运行的?

> 网上也搜不到相关的信息。头疼!
>
> 目前的解决方式的在服务器上跑一个小软件,每秒中与另外一台时间正常的服务器同步时间。
> >

吴德建

unread,
May 26, 2009, 9:28:15 PM5/26/09
to dev4s...@googlegroups.com
都是以管理员权限运行的!

2009/5/27 Lyman <lym...@gmail.com>

吴德建

unread,
May 26, 2009, 9:31:50 PM5/26/09
to dev4s...@googlegroups.com
ntp能解决问题!
现在就是希望找出问题的原因!这种现象太奇怪了!
系统时钟变快不说,类似变速器这种软件就可以实现。
最奇怪的是操作系统会隔个2、30秒就自动复原时间,不知道windows 2003有没有这种功能(没有开ntp服务)。

2009/5/27 Hailong Shu <shuha...@gmail.com>

Hailong Shu

unread,
May 26, 2009, 9:32:00 PM5/26/09
to dev4s...@googlegroups.com
windows的服务中就有NTP一项,配置配置就可以了。

2009/5/27 吴德建 <aga...@gmail.com>

qiaojie

unread,
May 26, 2009, 9:48:46 PM5/26/09
to dev4s...@googlegroups.com
你确定这不是硬件问题?换台机器试试

在 09-5-27,吴德建<aga...@gmail.com> 写道:

benegg

unread,
May 26, 2009, 10:19:43 PM5/26/09
to 高性能网络编程邮件列表
我比较感兴趣的是他怎么观测时间的. 用系统自带的任务栏上的时钟小程序?

On May 27, 9:48 am, qiaojie <qiao...@gmail.com> wrote:
> 你确定这不是硬件问题?换台机器试试
>
> 在 09-5-27,吴德建<aga...@gmail.com> 写道:
>
> > ntp能解决问题!
> > 现在就是希望找出问题的原因!这种现象太奇怪了!
> > 系统时钟变快不说,类似变速器这种软件就可以实现。
> > 最奇怪的是操作系统会隔个2、30秒就自动复原时间,不知道windows 2003有没有这种功能(没有开ntp服务)。
>

> > 2009/5/27 Hailong Shu <shuhail...@gmail.com>

bitjoe

unread,
May 26, 2009, 10:45:12 PM5/26/09
to dev4s...@googlegroups.com
有可能吧。windows系统原语是封装成硬件消息,再封装成windows消息,给程序进程调用。

服务器应该做过优化导致的,消息优先级被改变了。

吴德建

unread,
May 26, 2009, 10:47:25 PM5/26/09
to dev4s...@googlegroups.com
就是用系统自带的那个时钟程序看的,两台机器对比,能明显看出来快很多!

2009/5/27 benegg <ide...@163.com>

吴德建

unread,
May 26, 2009, 10:49:39 PM5/26/09
to dev4s...@googlegroups.com
换机器试过了,都有这个问题!
2009/5/27 qiaojie <qia...@gmail.com>

吴德建

unread,
May 26, 2009, 10:52:49 PM5/26/09
to dev4s...@googlegroups.com
服务器有没有优化就不知道了!
服务器是IBM的,问他们的工程师也问不出个所以然!
用PC装win2003反而没有问题!
下一步准备搞个服务器装Linux试试!

2009/5/27 bitjoe <darve...@gmail.com>

qiaojie

unread,
May 26, 2009, 11:03:58 PM5/26/09
to dev4s...@googlegroups.com
那就说明IBM的服务器有问题,这问题还是跟硬件相关。


2009/5/27 吴德建 <aga...@gmail.com>:

benegg

unread,
May 26, 2009, 11:55:30 PM5/26/09
to 高性能网络编程邮件列表
也可能是软件的问题, 软件调用了错误的时钟获取接口.

On May 27, 11:03 am, qiaojie <qiao...@gmail.com> wrote:
> 那就说明IBM的服务器有问题,这问题还是跟硬件相关。
>
> 2009/5/27 吴德建 <aga...@gmail.com>:
>
> > 服务器有没有优化就不知道了!
> > 服务器是IBM的,问他们的工程师也问不出个所以然!
> > 用PC装win2003反而没有问题!
> > 下一步准备搞个服务器装Linux试试!
>

> > 2009/5/27 bitjoe <darvei.q...@gmail.com>

qiaojie

unread,
May 27, 2009, 12:21:28 AM5/27/09
to dev4s...@googlegroups.com
那你可以发个bug report给微软,说他们的时钟软件调用了错误的时钟获取接口


2009/5/27 benegg <ide...@163.com>:

jinbiao xu

unread,
May 27, 2009, 12:53:03 AM5/27/09
to dev4s...@googlegroups.com
你用VC++  调用WINDOWS 底层 去做 看看  或把 JAVA 移植到LIUNX 上去
 
虚拟机对提供大服务是有很多问题的 ! 以前我用C# 也遇到过问题!
还是 老老实实 的自己实现服务吧 不要靠那些 虚拟机和运行库!
2009/5/27 w <aga...@gmail.com>
--
艰苦奋斗,勇敢前进!

吴德建

unread,
May 27, 2009, 2:05:02 AM5/27/09
to dev4s...@googlegroups.com
现在正在考虑换到linux下去试试,不过网管有抵触,主要是他们不会linux,郁闷啊!

2009/5/27 jinbiao xu <xjb...@gmail.com>

jinbiao xu

unread,
May 27, 2009, 2:09:26 AM5/27/09
to dev4s...@googlegroups.com
你先实验下载说 大服务的都要利用系统底层去做,自己整估计还是问题多多啊!
 
             你JAVA c# 写这个东西 简单 出问题, 那就叫哭笑不得!
  本人还是提倡你底层语言结合系统特性写!

2009/5/27 吴德建 <aga...@gmail.com>



--
艰苦奋斗,勇敢前进!

Hailong Shu

unread,
May 27, 2009, 2:15:04 AM5/27/09
to dev4s...@googlegroups.com
和语言肯定没有关系,语言不知道在硬件多少层上面了。
估计还是个环境问题的可能最大。

2009/5/27 jinbiao xu <xjb...@gmail.com>

jinbiao xu

unread,
May 27, 2009, 2:20:23 AM5/27/09
to dev4s...@googlegroups.com
有关系 !特别是大功率并发的程序  肯定是要 C c++ VC++ 之类的东西配合系统接口来做
               光内存开销 回收 就是个问题
               垃圾回收器根本无法和那些东西比。
 
当然 做做小规模的东西 还是没有影响的!
 
程序的规模自己判断!

2009/5/27 Hailong Shu <shuha...@gmail.com>
和语言肯定没有关系,语言不知道在硬件多少层上面了。
估计还是个环境问题的可能最大。

2009/5/27 jinbiao xu <xjb...@gmail.com>



--
艰苦奋斗,勇敢前进!

--
艰苦奋斗,勇敢前进!

benegg

unread,
May 27, 2009, 2:28:46 AM5/27/09
to 高性能网络编程邮件列表
对的, 楼主应该同时给微软和IBM发bug report, 请求他们帮忙分析这个问题.

Hailong Shu

unread,
May 27, 2009, 2:31:18 AM5/27/09
to dev4s...@googlegroups.com
和内存没有关系,和内存申请释放的开销也没有关系。
时间是最基础的OS部件,OS也是调用硬件的功能来经行时间处理的。
你说的那个大功率太笼统,讲讲线程很多切换频繁还靠靠谱,讲内存开销就太远了。根本就是OS中不同的模块。
 
倒是楼主去查查进程中的线程数目极限相关的MS文档的好。看看MS的系统中对与一个进程中的线程数目有没有最大限制。这个实现在OS的THREAD模型里面肯定也是有一个极限值的。是不是和用户,核心和混合这些线程模型在MS系统中的具体实现限制有关系。
 
UPD搞那么多线程,每个线程任务都很饱满么?
 
 

 
2009/5/27 jinbiao xu <xjb...@gmail.com>

jinbiao xu

unread,
May 27, 2009, 2:36:42 AM5/27/09
to dev4s...@googlegroups.com
线程很多切换 ,肯定会耗费CPU 啊 你的是多核心 还是单核CPU
 
你可以WIN2003 下  UDP+IOCP  配合来做 这样 2000多发 不成问题。

2009/5/27 Hailong Shu <shuha...@gmail.com>
 
 

 
2009/5/27 jinbiao xu <xjb...@gmail.com>
2009/5/27 Hailong Shu <shuha...@gmail.com>

和语言肯定没有关系,语言不知道在硬件多少层上面了。
估计还是个环境问题的可能最大。

2009/5/27 jinbiao xu <xjb...@gmail.com>



--
艰苦奋斗,勇敢前进!

--
艰苦奋斗,勇敢前进!

--
艰苦奋斗,勇敢前进!

raymond

unread,
May 28, 2009, 7:09:19 AM5/28/09
to 高性能网络编程邮件列表
http://blog.csdn.net/luozhenyu/archive/2008/11/07/3247740.aspx
系统时间片和sleep的时间之间的差距可能导致windows显示时间变快。但是为什么又会回复呢?

吴德建

unread,
May 31, 2009, 12:39:51 AM5/31/09
to dev4s...@googlegroups.com
加上 -XX:+ForceTimeHighResolution 再说

2009/5/28 raymond <shiq...@gmail.com>

维超类

unread,
May 31, 2009, 3:36:34 AM5/31/09
to dev4s...@googlegroups.com
这个现象在理论上是存在的,因为系统的时钟也是操作系统通过响应硬件的中断来实现的,由于负载过大导致中断被延迟或操作系统不能及时的处理中断请求都可能导致时间的出现波动(毕竟时钟中断的优先级不是很高)

2009/5/31 吴德建 <aga...@gmail.com>:

jinq...@163.com

unread,
May 31, 2009, 11:00:11 PM5/31/09
to dev4s...@googlegroups.com
应用软件负载过大造成时钟中断被延时,不太可能。
即使如此,应该是时钟变慢,不应该变快吧?

维超类 写道:

bitjoe

unread,
May 31, 2009, 11:55:10 PM5/31/09
to dev4s...@googlegroups.com
我也觉得不太可能。

楼主你程序没有界面吧?时钟消息比较麻烦,想不出好办法,不如你改变下优先级,调节为前台程序优化试试看,如果有变化就是有影响。

WM_TIMER能不能查看下,进程消息队列里面。

谁有办法?时钟驱动的cpu,监控时钟消息。

其实就算用c++也不一定要关注系统具体平台,很多开发包的,就跟java一样,不过区别在于java是动态的,c是静态的,依赖编译时的。

维超类

unread,
Jun 1, 2009, 9:48:40 PM6/1/09
to dev4s...@googlegroups.com
是时钟变快吗? 我还以为变慢呢!,想想啊 不过变慢在理论上应该是存在的

2009/6/1 bitjoe <darve...@gmail.com>:

iceboundrock

unread,
Jun 2, 2009, 12:37:28 AM6/2/09
to 高性能网络编程邮件列表
我晕,UDP+IOCP,意义何在啊?都UDP了还有并发么?本质的问题并不在于语言或者平台,每个UDP包一个thread本来就不合理,UDP包收
到应该放入队列里面,启动固定的N个线程(N=CPU硬线程数量)来处理队列里的。
飞信的后台服务都是用.net做的,很早已经超过了并发百万人在线,不知道这算不算小应用。

On 5月27日, 下午2时36分, jinbiao xu <xjb...@gmail.com> wrote:
> 线程很多切换 ,肯定会耗费CPU 啊 你的是多核心 还是单核CPU
>
> 你可以WIN2003 下 UDP+IOCP 配合来做 这样 2000多发 不成问题。
>

> 2009/5/27 Hailong Shu <shuhail...@gmail.com>


>
>
>
>
>
> > 和内存没有关系,和内存申请释放的开销也没有关系。
> > 时间是最基础的OS部件,OS也是调用硬件的功能来经行时间处理的。
> > 你说的那个大功率太笼统,讲讲线程很多切换频繁还靠靠谱,讲内存开销就太远了。根本就是OS中不同的模块。
>

> > 倒是楼主去查查进程中的线程数目极限相关的MS文档的好。看看MS的系统中对与一个进程中的线程数目有没有最大限制。这个实现在OS的THREAD模型里面肯定 也是有一个极限值的。是不是和用户,核心和混合这些线程模型在MS系统中的具体实现限制有关系。


>
> > UPD搞那么多线程,每个线程任务都很饱满么?
>
> > 2009/5/27 jinbiao xu <xjb...@gmail.com>
>
> >> 有关系 !特别是大功率并发的程序 肯定是要 C c++ VC++ 之类的东西配合系统接口来做
> >> 光内存开销 回收 就是个问题
> >> 垃圾回收器根本无法和那些东西比。
>
> >> 当然 做做小规模的东西 还是没有影响的!
>
> >> 程序的规模自己判断!
>

> >> 2009/5/27 Hailong Shu <shuhail...@gmail.com>

Reply all
Reply to author
Forward
0 new messages