关于虚拟机下linux 定时的问题

时间:2020-12-10 07:55:42
我在虚拟机下发现一个问题,环境:虚拟机linux redhat 2.4 

struct timeval g_tv_1,g_tv_2;
struct timespec t;
long g_RealDisTime_1;
long g_RealDisTime_2;
struct timespec t;
t.tv_sec = 0;
t.tv_nsec = 8000;
gettimeofday (&g_tv_1, NULL);
nanosleep(&t,NULL);
gettimeofday (&g_tv_2, NULL);
g_RealDisTime_1 = ((g_tv_1.tv_sec * 1000) + (g_tv_1.tv_usec / 1000));
g_RealDisTime_2 = ((g_tv_2.tv_sec * 1000) + (g_tv_2.tv_usec / 1000));
printf ("line %d, use %lu ms\n", __LINE__, g_RealDisTime_2-g_RealDisTime_1);

1.我调用nanosleep函数休眠ms级的时间完全不准,预期8ms,实际打出来10几到30几ms都出现
2.t.tv_nsec = 8000改成t.tv_nsec = 800000;实际打出来结果和1一样。感觉t.tv_nsec这个参数忽略了。
3.t.tv_sec = 1; t.tv_nsec = 800000; 实际打出来结果1000ms左右,同2 感觉t.tv_nsec这个参数忽略了
4.将nanosleep(&t,NULL);改成usleep(40000); 实际打出来结果40-50多ms 勉强符合预期。
5.将usleep(40000); 改成usleep(<20000); 实际都是20ms左右 很不稳定。

为什么不能精确到ms级别的定时???
是虚拟机的问题还是系统的问题我在虚拟机的ubunto上也试过,问题也有。

8 个解决方案

#1


虚拟机的时钟是有问题的,特别是Windows下面的VMWare,简直就是噩梦。

#2


引用楼主 wightmight 的回复:
我在虚拟机下发现一个问题,环境:虚拟机linux redhat 2.4

 struct timeval g_tv_1,g_tv_2;
 struct timespec t;
 long g_RealDisTime_1;
 long g_RealDisTime_2;
 struct timespec t;
 t.tv_sec = 0;
 t.tv_nsec = 8000;
 gettimeofday (&g_tv_1, NULL);
 nanosleep(&t,NULL);
 gettimeofday (&g_tv_2, NULL);
 g_RealDisTime_1 = ((g_tv_1.tv_sec * 1000) + (g_tv_1.tv_usec / 1000));
 g_RealDisTime_2 = ((g_tv_2.tv_sec * 1000) + (g_tv_2.tv_usec / 1000));
 printf ("line %d, use %lu ms\n", __LINE__, g_RealDisTime_2-g_RealDisTime_1);

 1.我调用nanosleep函数休眠ms级的时间完全不准,预期8ms,实际打出来10几到30几ms都出现
 2.t.tv_nsec = 8000改成t.tv_nsec = 800000;实际打出来结果和1一样。感觉t.tv_nsec这个参数忽略了。
 3.t.tv_sec = 1; t.tv_nsec = 800000; 实际打出来结果1000ms左右,同2 感觉t.tv_nsec这个参数忽略了
 4.将nanosleep(&t,NULL);改成usleep(40000); 实际打出来结果40-50多ms 勉强符合预期。
 5.将usleep(40000); 改成usleep( <20000); 实际都是20ms左右 很不稳定。

 为什么不能精确到ms级别的定时???
 是虚拟机的问题还是系统的问题我在虚拟机的ubunto上也试过,问题也有。



你这不是虚拟机的问题。。
我在虚拟机做了这么长时间,从来没遇到过程序和虚拟机时间的问题。

你很明显是程序问题

#3


http://www.baidu.com/s?bs=vmware+%CA%B5%CA%B1%CA%B1%D6%D3&f=8&wd=vmware+%CA%B1%D6%D3

#4


引用 3 楼 iisbsd 的回复:
http://www.baidu.com/s?bs=vmware+%CA%B5%CA%B1%CA%B1%D6%D3&f=8&wd=vmware+%CA%B1%D6%D3


汗,,


用虚拟机不安装vmtool,你说怎么使用虚拟机。。。


用虚拟机肯定要装vmtool工具。。。。


不安此工具,麻烦不仅仅是时间问题,你后面会发现很多头文件都找不到的

#5


问题是装了VM tool也未必解决问题,我最后都换到Virtual Box和kvm了。

#6


引用 5 楼 iisbsd 的回复:
问题是装了VM tool也未必解决问题,我最后都换到Virtual Box和kvm了。



呵呵。LS严重了。我们的同事是虚拟机。呵呵。

那就看你如何解决问题了。还得看你版本。

不要一票否定哦。

呵呵

自己研究研究吧

#7


我也没有说一定不行,但是不行的情况还是不少的,不然也不会有那么多人找解决方案了。

我没有权利决定别人怎么用,但是如果想听我的意见,那还是换换平台比较好,起码我用Windows上的VMware已经6、7年了,时钟一直是个问题,两年前换到Virtual Box(Windows)和kvm(Linux)上以后,再也没有出现过时钟的问题了,可能我几年用的这几十台机器都不适合VMWare吧。

另外说一句无关的话,kvm的性能比VMware高很多,一台双核的机器上,跑ESXi只能支持3个虚拟机就不怎么好了,在kvm下面我跑了5个好像还能加。

#8


引用 7 楼 iisbsd 的回复:
我也没有说一定不行,但是不行的情况还是不少的,不然也不会有那么多人找解决方案了。

 我没有权利决定别人怎么用,但是如果想听我的意见,那还是换换平台比较好,起码我用Windows上的VMware已经6、7年了,时钟一直是个问题,两年前换到Virtual Box(Windows)和kvm(Linux)上以后,再也没有出现过时钟的问题了,可能我几年用的这几十台机器都不适合VMWare吧。

 另外说一句无关的话,kvm的性能比VMware高很多,一台双核的机器上,跑ESXi只能支持3个虚拟机就不怎么好了,在kvm下面我跑了5个好像还能加。


恩。呵呵。你还比较执着。呵呵

跑虚拟机我就不指望跑几个了。


反正我是没碰到过。
我还是喜欢用vm

#1


虚拟机的时钟是有问题的,特别是Windows下面的VMWare,简直就是噩梦。

#2


引用楼主 wightmight 的回复:
我在虚拟机下发现一个问题,环境:虚拟机linux redhat 2.4

 struct timeval g_tv_1,g_tv_2;
 struct timespec t;
 long g_RealDisTime_1;
 long g_RealDisTime_2;
 struct timespec t;
 t.tv_sec = 0;
 t.tv_nsec = 8000;
 gettimeofday (&g_tv_1, NULL);
 nanosleep(&t,NULL);
 gettimeofday (&g_tv_2, NULL);
 g_RealDisTime_1 = ((g_tv_1.tv_sec * 1000) + (g_tv_1.tv_usec / 1000));
 g_RealDisTime_2 = ((g_tv_2.tv_sec * 1000) + (g_tv_2.tv_usec / 1000));
 printf ("line %d, use %lu ms\n", __LINE__, g_RealDisTime_2-g_RealDisTime_1);

 1.我调用nanosleep函数休眠ms级的时间完全不准,预期8ms,实际打出来10几到30几ms都出现
 2.t.tv_nsec = 8000改成t.tv_nsec = 800000;实际打出来结果和1一样。感觉t.tv_nsec这个参数忽略了。
 3.t.tv_sec = 1; t.tv_nsec = 800000; 实际打出来结果1000ms左右,同2 感觉t.tv_nsec这个参数忽略了
 4.将nanosleep(&t,NULL);改成usleep(40000); 实际打出来结果40-50多ms 勉强符合预期。
 5.将usleep(40000); 改成usleep( <20000); 实际都是20ms左右 很不稳定。

 为什么不能精确到ms级别的定时???
 是虚拟机的问题还是系统的问题我在虚拟机的ubunto上也试过,问题也有。



你这不是虚拟机的问题。。
我在虚拟机做了这么长时间,从来没遇到过程序和虚拟机时间的问题。

你很明显是程序问题

#3


http://www.baidu.com/s?bs=vmware+%CA%B5%CA%B1%CA%B1%D6%D3&f=8&wd=vmware+%CA%B1%D6%D3

#4


引用 3 楼 iisbsd 的回复:
http://www.baidu.com/s?bs=vmware+%CA%B5%CA%B1%CA%B1%D6%D3&f=8&wd=vmware+%CA%B1%D6%D3


汗,,


用虚拟机不安装vmtool,你说怎么使用虚拟机。。。


用虚拟机肯定要装vmtool工具。。。。


不安此工具,麻烦不仅仅是时间问题,你后面会发现很多头文件都找不到的

#5


问题是装了VM tool也未必解决问题,我最后都换到Virtual Box和kvm了。

#6


引用 5 楼 iisbsd 的回复:
问题是装了VM tool也未必解决问题,我最后都换到Virtual Box和kvm了。



呵呵。LS严重了。我们的同事是虚拟机。呵呵。

那就看你如何解决问题了。还得看你版本。

不要一票否定哦。

呵呵

自己研究研究吧

#7


我也没有说一定不行,但是不行的情况还是不少的,不然也不会有那么多人找解决方案了。

我没有权利决定别人怎么用,但是如果想听我的意见,那还是换换平台比较好,起码我用Windows上的VMware已经6、7年了,时钟一直是个问题,两年前换到Virtual Box(Windows)和kvm(Linux)上以后,再也没有出现过时钟的问题了,可能我几年用的这几十台机器都不适合VMWare吧。

另外说一句无关的话,kvm的性能比VMware高很多,一台双核的机器上,跑ESXi只能支持3个虚拟机就不怎么好了,在kvm下面我跑了5个好像还能加。

#8


引用 7 楼 iisbsd 的回复:
我也没有说一定不行,但是不行的情况还是不少的,不然也不会有那么多人找解决方案了。

 我没有权利决定别人怎么用,但是如果想听我的意见,那还是换换平台比较好,起码我用Windows上的VMware已经6、7年了,时钟一直是个问题,两年前换到Virtual Box(Windows)和kvm(Linux)上以后,再也没有出现过时钟的问题了,可能我几年用的这几十台机器都不适合VMWare吧。

 另外说一句无关的话,kvm的性能比VMware高很多,一台双核的机器上,跑ESXi只能支持3个虚拟机就不怎么好了,在kvm下面我跑了5个好像还能加。


恩。呵呵。你还比较执着。呵呵

跑虚拟机我就不指望跑几个了。


反正我是没碰到过。
我还是喜欢用vm