Skip to contentSkip to conversation

timedrift support

PATCH In review Bear Yang 4 participants 13 messages May 6, 2009 – May 18, 2009 KVM

lore
Share & tools
lore

Bear Yang

author
#0 lore raw

PATCH 1/1 timedrift support

Hello everyone,

I like to submit patch to add a new function for 'time drift check' for guest running on KVM.

The TimeDrift design logic is below:
1. Set the host as the NTP server
2. Guest only sync it's clock with host *once* when it booted up.
* if the offset value of ntpdate large than 1 sec, the guest will sync the clock with host.
* if the offset value of ntpdate less than 1 sec, the guest doesn't need sync it's clock with host.

3. Then the cpu stress testing will running on guest.
* a C program will give the real load to guest cpu
4.when the cpustress testing finished. running the commandline <ntpdate -q host-ip> totally 20 times on guest to query the time from host and judge whether the guest clock has drift or not.

The details of my patch is attached.

thanks.

Bear.

cpu_stress.c +61 -0
diff -urN kvm_runtest_2.bak/cpu_stress.c kvm_runtest_2/cpu_stress.c
@@ -0,0 +1,61 @@
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <pthread.h>
+#include <sched.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <math.h>
+#include <unistd.h>
+
+#define MAX_CPUS 256
+#define BUFFSIZE 1024
+
+
+void worker_child(int cpu)
+{
+	int cur_freq;
+	int min_freq;
+	int max_freq;
+	int last_freq;
+	cpu_set_t mask;
+	int i;
+	double x;
+        int d = 0;
+	/*
+	 * bind this thread to the specified cpu 
+	 */
+	CPU_ZERO(&mask);
+	CPU_SET(cpu, &mask);
+	sched_setaffinity(0, CPU_SETSIZE, &mask);
+
+	while (d++ != 500000) {
+			for (i=0; i<100000; i++)
+				x = sqrt(x);
+	}
+
+	_exit(0);
+
+}
+
+
+main() {
+	cpu_set_t mask;
+	int i;
+	int code;
+
+	if (sched_getaffinity(0, CPU_SETSIZE, &mask) < 0){
+		perror ("sched_getaffinity");
+		exit(1);
+	}
+
+	for (i=0; i<CPU_SETSIZE; i++)
+		if (CPU_ISSET(i, &mask)){
+			printf ("CPU%d\n",i);
+			if (fork() == 0)
+				worker_child(i);
+		}
+
+
+	wait(&code);
+	exit (WEXITSTATUS(code));
+}
kvm_runtest_2.py +2 -0
diff -urN kvm_runtest_2.bak/kvm_runtest_2.py kvm_runtest_2/kvm_runtest_2.py
@@ -36,6 +36,8 @@
                 "autotest":     test_routine("kvm_tests",           "run_autotest"),
                 "kvm_install":  test_routine("kvm_install",         "run_kvm_install"),
                 "linux_s3":     test_routine("kvm_tests",           "run_linux_s3"),
+                "ntp_server_setup": test_routine("kvm_tests",       "run_ntp_server_setup"),
+                "timedrift":    test_routine("kvm_tests",           "run_timedrift"),
                 }
 
         # Make it possible to import modules from the test's bindir
kvm_tests.cfg.sample +4 -0
diff -urN kvm_runtest_2.bak/kvm_tests.cfg.sample kvm_runtest_2/kvm_tests.cfg.sample
@@ -81,6 +81,10 @@
     - linux_s3:      install setup
         type = linux_s3
 
+    - ntp_server_setup:
+        type = ntp_server_setup
+    - timedrift:      ntp_server_setup
+        type = timedrift
 # NICs
 variants:
     - @rtl8139:
kvm_tests.py +232 -0

235 lines not on this page · raw message

#1 lore raw

Bear,

Some comments below.

Quoted 163 lines · Bear Yang

Hello everyone,

I like to submit patch to add a new function for 'time drift check' for guest running on KVM.

The TimeDrift design logic is below:
1. Set the host as the NTP server
2. Guest only sync it's clock with host *once* when it booted up.
* if the offset value of ntpdate large than 1 sec, the guest will sync the clock with host.
* if the offset value of ntpdate less than 1 sec, the guest doesn't need sync it's clock with host.

3. Then the cpu stress testing will running on guest.
* a C program will give the real load to guest cpu
4.when the cpustress testing finished. running the commandline <ntpdate -q host-ip> totally 20 times on guest to query the time from host and judge whether the guest clock has drift or not.

The details of my patch is attached.

thanks.

Bear.

diff -urN kvm_runtest_2.bak/cpu_stress.c kvm_runtest_2/cpu_stress.c

cpu_stress.c +61 -0
@@ -0,0 +1,61 @@
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <pthread.h>
+#include <sched.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <math.h>
+#include <unistd.h>
+
+#define MAX_CPUS 256
+#define BUFFSIZE 1024
+
+
+void worker_child(int cpu)
+{
+	int cur_freq;
+	int min_freq;
+	int max_freq;
+	int last_freq;
+	cpu_set_t mask;
+	int i;
+	double x;
+        int d = 0;
+	/*
+	 * bind this thread to the specified cpu 
+	 */
+	CPU_ZERO(&mask);
+	CPU_SET(cpu, &mask);
+	sched_setaffinity(0, CPU_SETSIZE, &mask);
+
+	while (d++ != 500000) {
+			for (i=0; i<100000; i++)
+				x = sqrt(x);
+	}
+
+	_exit(0);
+
+}
+
+
+main() {
+	cpu_set_t mask;
+	int i;
+	int code;
+
+	if (sched_getaffinity(0, CPU_SETSIZE, &mask) < 0){
+		perror ("sched_getaffinity");
+		exit(1);
+	}
+
+	for (i=0; i<CPU_SETSIZE; i++)
+		if (CPU_ISSET(i, &mask)){
+			printf ("CPU%d\n",i);
+			if (fork() == 0)
+				worker_child(i);
+		}
+
+
+	wait(&code);
+	exit (WEXITSTATUS(code));
+}

diff -urN kvm_runtest_2.bak/kvm_runtest_2.py kvm_runtest_2/kvm_runtest_2.py

kvm_runtest_2.py +2 -0
@@ -36,6 +36,8 @@
                 "autotest":     test_routine("kvm_tests",           "run_autotest"),
                 "kvm_install":  test_routine("kvm_install",         "run_kvm_install"),
                 "linux_s3":     test_routine("kvm_tests",           "run_linux_s3"),
+                "ntp_server_setup": test_routine("kvm_tests",       "run_ntp_server_setup"),
+                "timedrift":    test_routine("kvm_tests",           "run_timedrift"),
                 }
 
         # Make it possible to import modules from the test's bindir

diff -urN kvm_runtest_2.bak/kvm_tests.cfg.sample kvm_runtest_2/kvm_tests.cfg.sample

kvm_tests.cfg.sample +4 -0
@@ -81,6 +81,10 @@
     - linux_s3:      install setup
         type = linux_s3
 
+    - ntp_server_setup:
+        type = ntp_server_setup
+    - timedrift:      ntp_server_setup
+        type = timedrift
 # NICs
 variants:
     - @rtl8139:

diff -urN kvm_runtest_2.bak/kvm_tests.py kvm_runtest_2/kvm_tests.py

kvm_tests.py +40 -0
@@ -394,3 +394,235 @@
     kvm_log.info("VM resumed after S3")
 
     session.close()
+
+def run_ntp_server_setup(test, params, env):
+    
+    """NTP server configuration and related network file modification
+    """
+    kvm_log.debug("run ntp server setup")
+    status = 1
+    # stop firewall for NTP server if it is running.
+    status = os.system("/etc/init.d/iptables status")
+    if status == 0:
+        os.system("/etc/init.d/iptables stop")
+        status = 1
+
+    # prevent dhcp client modify the ntp.conf
+    kvm_log.info("prevent dhcp client modify the ntp.conf")
+
+    config_file = "/etc/sysconfig/network"
+    network_file = open("/etc/sysconfig/network", "a")
+    string = "PEERNTP=no"
+
+    if os.system("grep %s %s" % (string, config_file)):
+        network_file.writelines(str(string)+'\n')
+    
+    network_file.close()
+  
+    # start ntp server on host
+    kvm_log.info("backup ntp config file")
+
+    ntp_filename = os.path.expanduser("/etc/ntp.conf")
+    # backup ntp config file
+    backup_bootloader_filename = ntp_filename + "_backup"
+    if os.path.exists(ntp_filename):
+        os.rename(ntp_filename, backup_bootloader_filename)
+    
+    status = os.system("/etc/init.d/ntpd status")
+    if status == 0:
+        os.system("/etc/init.d/ntpd stop")
+        status = 1    
+
+    kvm_log.info("start ntp server on host")

kvm_tests.py line 446

Quoted 10 lines
kvm_tests.py +10 -0
+
+    ntp_cmd = '''
+        echo "restrict default kod nomodify notrap nopeer noquery" >> /etc/ntp.conf;\
+        echo "restrict 127.0.0.1" >> /etc/ntp.conf;\
+        echo "driftfile /var/lib/ntp/drift" >> /etc/ntp.conf;\
+        echo "keys /etc/ntp/keys" >> /etc/ntp.conf;\
+        echo "server 127.127.1.0" >> /etc/ntp.conf;\
+        echo "fudge 127.127.1.0 stratum 1" >> /etc/ntp.conf;\
+        service ntpd start;
+        '''

I think it would be better to copy /etc/ntp.conf to a temporary file, modify that, and start ntpd with the -c option.

After the test is finished, restart ntpd with the default config (if it was running) via service ntpd restart.

Also I don't see whether your script reports the content of

/sys/devices/system/clocksource/clocksource0/current_clocksource

On the guest? Its important that information is displayed on the test report.

Looks fine to me other than that, but the kvm-autotest guys probably have more comments.

Thanks

author
#2 lore raw

Hello.
I have modified my script according Marcelo's suggestion. and resubmit my script to you all. :)

Marcelo, Seems except you, no one care my script. I still want to say any suggestion on my script would be greatly appreciated.

Thanks.

Bear

Quoted 193 lines · Marcelo Tosatti

Bear,

Some comments below.

Quoted 163 lines · Bear Yang

Hello everyone,

I like to submit patch to add a new function for 'time drift check' for guest running on KVM.

The TimeDrift design logic is below:
1. Set the host as the NTP server
2. Guest only sync it's clock with host *once* when it booted up.
* if the offset value of ntpdate large than 1 sec, the guest will sync the clock with host.
* if the offset value of ntpdate less than 1 sec, the guest doesn't need sync it's clock with host.

3. Then the cpu stress testing will running on guest.
* a C program will give the real load to guest cpu
4.when the cpustress testing finished. running the commandline <ntpdate -q host-ip> totally 20 times on guest to query the time from host and judge whether the guest clock has drift or not.

The details of my patch is attached.

thanks.

Bear.

diff -urN kvm_runtest_2.bak/cpu_stress.c kvm_runtest_2/cpu_stress.c

cpu_stress.c +61 -0
@@ -0,0 +1,61 @@
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <pthread.h>
+#include <sched.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <math.h>
+#include <unistd.h>
+
+#define MAX_CPUS 256
+#define BUFFSIZE 1024
+
+
+void worker_child(int cpu)
+{
+	int cur_freq;
+	int min_freq;
+	int max_freq;
+	int last_freq;
+	cpu_set_t mask;
+	int i;
+	double x;
+        int d = 0;
+	/*
+	 * bind this thread to the specified cpu 
+	 */
+	CPU_ZERO(&mask);
+	CPU_SET(cpu, &mask);
+	sched_setaffinity(0, CPU_SETSIZE, &mask);
+
+	while (d++ != 500000) {
+			for (i=0; i<100000; i++)
+				x = sqrt(x);
+	}
+
+	_exit(0);
+
+}
+
+
+main() {
+	cpu_set_t mask;
+	int i;
+	int code;
+
+	if (sched_getaffinity(0, CPU_SETSIZE, &mask) < 0){
+		perror ("sched_getaffinity");
+		exit(1);
+	}
+
+	for (i=0; i<CPU_SETSIZE; i++)
+		if (CPU_ISSET(i, &mask)){
+			printf ("CPU%d\n",i);
+			if (fork() == 0)
+				worker_child(i);
+		}
+
+
+	wait(&code);
+	exit (WEXITSTATUS(code));
+}

diff -urN kvm_runtest_2.bak/kvm_runtest_2.py kvm_runtest_2/kvm_runtest_2.py

kvm_runtest_2.py +2 -0
@@ -36,6 +36,8 @@
                 "autotest":     test_routine("kvm_tests",           "run_autotest"),
                 "kvm_install":  test_routine("kvm_install",         "run_kvm_install"),
                 "linux_s3":     test_routine("kvm_tests",           "run_linux_s3"),
+                "ntp_server_setup": test_routine("kvm_tests",       "run_ntp_server_setup"),
+                "timedrift":    test_routine("kvm_tests",           "run_timedrift"),
                 }
 
         # Make it possible to import modules from the test's bindir

diff -urN kvm_runtest_2.bak/kvm_tests.cfg.sample kvm_runtest_2/kvm_tests.cfg.sample

kvm_tests.cfg.sample +4 -0
@@ -81,6 +81,10 @@
     - linux_s3:      install setup
         type = linux_s3
 
+    - ntp_server_setup:
+        type = ntp_server_setup
+    - timedrift:      ntp_server_setup
+        type = timedrift
 # NICs
 variants:
     - @rtl8139:

diff -urN kvm_runtest_2.bak/kvm_tests.py kvm_runtest_2/kvm_tests.py

kvm_tests.py +40 -0
@@ -394,3 +394,235 @@
     kvm_log.info("VM resumed after S3")
 
     session.close()
+
+def run_ntp_server_setup(test, params, env):
+    
+    """NTP server configuration and related network file modification
+    """
+    kvm_log.debug("run ntp server setup")
+    status = 1
+    # stop firewall for NTP server if it is running.
+    status = os.system("/etc/init.d/iptables status")
+    if status == 0:
+        os.system("/etc/init.d/iptables stop")
+        status = 1
+
+    # prevent dhcp client modify the ntp.conf
+    kvm_log.info("prevent dhcp client modify the ntp.conf")
+
+    config_file = "/etc/sysconfig/network"
+    network_file = open("/etc/sysconfig/network", "a")
+    string = "PEERNTP=no"
+
+    if os.system("grep %s %s" % (string, config_file)):
+        network_file.writelines(str(string)+'\n')
+    
+    network_file.close()
+  
+    # start ntp server on host
+    kvm_log.info("backup ntp config file")
+
+    ntp_filename = os.path.expanduser("/etc/ntp.conf")
+    # backup ntp config file
+    backup_bootloader_filename = ntp_filename + "_backup"
+    if os.path.exists(ntp_filename):
+        os.rename(ntp_filename, backup_bootloader_filename)
+    
+    status = os.system("/etc/init.d/ntpd status")
+    if status == 0:
+        os.system("/etc/init.d/ntpd stop")
+        status = 1    
+
+    kvm_log.info("start ntp server on host")

kvm_tests.py line 446

Quoted 10 lines
kvm_tests.py +10 -0
+
+    ntp_cmd = '''
+        echo "restrict default kod nomodify notrap nopeer noquery" >> /etc/ntp.conf;\
+        echo "restrict 127.0.0.1" >> /etc/ntp.conf;\
+        echo "driftfile /var/lib/ntp/drift" >> /etc/ntp.conf;\
+        echo "keys /etc/ntp/keys" >> /etc/ntp.conf;\
+        echo "server 127.127.1.0" >> /etc/ntp.conf;\
+        echo "fudge 127.127.1.0 stratum 1" >> /etc/ntp.conf;\
+        service ntpd start;
+        '''

I think it would be better to copy /etc/ntp.conf to a temporary file, modify that, and start ntpd with the -c option.

After the test is finished, restart ntpd with the default config (if it was running) via service ntpd restart.

Also I don't see whether your script reports the content of

/sys/devices/system/clocksource/clocksource0/current_clocksource

On the guest? Its important that information is displayed on the test report.

Quoted 9 lines

Looks fine to me other than that, but the kvm-autotest guys probably have more comments.

Thanks
--
To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

cpu_stress.c +61 -0
diff -urN kvm_runtest_2.bak/cpu_stress.c kvm_runtest_2/cpu_stress.c
@@ -0,0 +1,61 @@
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <pthread.h>
+#include <sched.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <math.h>
+#include <unistd.h>
+
+#define MAX_CPUS 256
+#define BUFFSIZE 1024
+
+
+void worker_child(int cpu)
+{
+	int cur_freq;
+	int min_freq;
+	int max_freq;
+	int last_freq;
+	cpu_set_t mask;
+	int i;
+	double x;
+        int d = 0;
+	/*
+	 * bind this thread to the specified cpu 
+	 */
+	CPU_ZERO(&mask);
+	CPU_SET(cpu, &mask);
+	sched_setaffinity(0, CPU_SETSIZE, &mask);
+
+	while (d++ != 500000) {
+			for (i=0; i<100000; i++)
+				x = sqrt(x);
+	}
+
+	_exit(0);
+
+}
+
+
+main() {
+	cpu_set_t mask;
+	int i;
+	int code;
+
+	if (sched_getaffinity(0, CPU_SETSIZE, &mask) < 0){
+		perror ("sched_getaffinity");
+		exit(1);
+	}
+
+	for (i=0; i<CPU_SETSIZE; i++)
+		if (CPU_ISSET(i, &mask)){
+			printf ("CPU%d\n",i);
+			if (fork() == 0)
+				worker_child(i);
+		}
+
+
+	wait(&code);
+	exit (WEXITSTATUS(code));
+}
kvm_runtest_2.py +2 -0
diff -urN kvm_runtest_2.bak/kvm_runtest_2.py kvm_runtest_2/kvm_runtest_2.py
@@ -36,6 +36,8 @@
                 "autotest":     test_routine("kvm_tests",           "run_autotest"),
                 "kvm_install":  test_routine("kvm_install",         "run_kvm_install"),
                 "linux_s3":     test_routine("kvm_tests",           "run_linux_s3"),
+                "ntp_server_setup": test_routine("kvm_tests",       "run_ntp_server_setup"),
+                "timedrift":    test_routine("kvm_tests",           "run_timedrift"),
                 }
 
         # Make it possible to import modules from the test's bindir
kvm_tests.cfg.sample +4 -0
diff -urN kvm_runtest_2.bak/kvm_tests.cfg.sample kvm_runtest_2/kvm_tests.cfg.sample
@@ -81,6 +81,10 @@
     - linux_s3:      install setup
         type = linux_s3
 
+    - ntp_server_setup:
+        type = ntp_server_setup
+    - timedrift:      ntp_server_setup
+        type = timedrift
 # NICs
 variants:
     - @rtl8139:
kvm_tests.py +244 -0

247 lines not on this page · raw message

#3 lore raw
Quoted 24 lines · Bear Yang

Hello.
I have modified my script according Marcelo's suggestion. and resubmit my script to you all. :)

Marcelo, Seems except you, no one care my script. I still want to say any suggestion on my script would be greatly appreciated.

Thanks.

Bear

Quoted 14 lines · Marcelo Tosatti

Bear,

Some comments below.

Quoted 9 lines · Bear Yang

Hello everyone,

I like to submit patch to add a new function for 'time drift check' for guest running on KVM.

The TimeDrift design logic is below:
1. Set the host as the NTP server
2. Guest only sync it's clock with host *once* when it booted up.
* if the offset value of ntpdate large than 1 sec, the guest will sync the clock with host.
* if the offset value of ntpdate less than 1 sec, the guest doesn't need sync it's clock with host.

I don't see the value of doing all the NTP stuff above. It poses another requirement on the host.

Quoted 3 lines
Quoted 3 lines
Quoted 3 lines

3. Then the cpu stress testing will running on guest.
* a C program will give the real load to guest cpu

Isn't there any available program that can perform a load on the guest CPU? Moreover, I believe we want different kinds of loads to be tested (mixed with I/O, for example).

Quoted 7 lines
Quoted 7 lines
Quoted 7 lines

4.when the cpustress testing finished. running the commandline <ntpdate -q host-ip> totally 20 times on guest to query the time from host and judge whether the guest clock has drift or not.

The details of my patch is attached.

thanks.

Bear.

I might be missing something, but generally, what I feel should be the test is:
1. Load the guest (AND the host - configurable!)
2. Run a program for X minutes on the guest - as measured by the guest (say 3 minutes).
3. When it exits, check that indeed Xhost = Xguest (in some cases we've seen here: 3:15 on the host, vs. 3:00 on the guest).

Looks like a much simpler plan than yours. And should also be pretty portable to Windows.

Y.

Quoted 179 lines
Quoted 178 lines
Quoted 149 lines

diff -urN kvm_runtest_2.bak/cpu_stress.c kvm_runtest_2/cpu_stress.c
--- kvm_runtest_2.bak/cpu_stress.c 1969-12-31 19:00:00.000000000
-0500
+++ kvm_runtest_2/cpu_stress.c 2009-05-05 22:35:34.000000000 -0400

cpu_stress.c +60 -0
@@ -0,0 +1,61 @@
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <pthread.h>
+#include <sched.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <math.h>
+#include <unistd.h>
+
+#define MAX_CPUS 256
+#define BUFFSIZE 1024
+
+
+void worker_child(int cpu)
+{
+    int cur_freq;
+    int min_freq;
+    int max_freq;
+    int last_freq;
+    cpu_set_t mask;
+    int i;
+    double x;
+        int d = 0;
+    /*
+     * bind this thread to the specified cpu +     */
+    CPU_ZERO(&mask);
+    CPU_SET(cpu, &mask);
+    sched_setaffinity(0, CPU_SETSIZE, &mask);
+
+    while (d++ != 500000) {
+            for (i=0; i<100000; i++)
+                x = sqrt(x);
+    }
+
+    _exit(0);
+
+}
+
+
+main() {
+    cpu_set_t mask;
+    int i;
+    int code;
+
+    if (sched_getaffinity(0, CPU_SETSIZE, &mask) < 0){
+        perror ("sched_getaffinity");
+        exit(1);
+    }
+
+    for (i=0; i<CPU_SETSIZE; i++)
+        if (CPU_ISSET(i, &mask)){
+            printf ("CPU%d\n",i);
+            if (fork() == 0)
+                worker_child(i);
+        }
+
+
+    wait(&code);
+    exit (WEXITSTATUS(code));
+}

diff -urN kvm_runtest_2.bak/kvm_runtest_2.py kvm_runtest_2/kvm_runtest_2.py
--- kvm_runtest_2.bak/kvm_runtest_2.py 2009-04-29
06:17:29.000000000 -0400
+++ kvm_runtest_2/kvm_runtest_2.py 2009-04-29 08:06:32.000000000
-0400

(quoted diff) +1 -0
@@ -36,6 +36,8 @@
                 "autotest":     test_routine("kvm_tests",           
 "run_autotest"),
                 "kvm_install":  test_routine("kvm_install",         
 "run_kvm_install"),
                 "linux_s3":     test_routine("kvm_tests",           
 "run_linux_s3"),
+                "ntp_server_setup": test_routine("kvm_tests",       

"run_ntp_server_setup"),
+ "timedrift": test_routine("kvm_tests",
"run_timedrift"),
}

# Make it possible to import modules from the test's bindir
diff -urN kvm_runtest_2.bak/kvm_tests.cfg.sample kvm_runtest_2/kvm_tests.cfg.sample
--- kvm_runtest_2.bak/kvm_tests.cfg.sample 2009-04-29
06:17:29.000000000 -0400
+++ kvm_runtest_2/kvm_tests.cfg.sample 2009-04-29
08:09:36.000000000 -0400

kvm_tests.cfg.sample +4 -0
@@ -81,6 +81,10 @@
     - linux_s3:      install setup
         type = linux_s3
 
+    - ntp_server_setup:
+        type = ntp_server_setup
+    - timedrift:      ntp_server_setup
+        type = timedrift
 # NICs
 variants:
     - @rtl8139:

diff -urN kvm_runtest_2.bak/kvm_tests.py kvm_runtest_2/kvm_tests.py
--- kvm_runtest_2.bak/kvm_tests.py 2009-04-29 06:17:29.000000000
-0400
+++ kvm_runtest_2/kvm_tests.py 2009-05-05 23:45:57.000000000 -0400

kvm_tests.py +3 -0
@@ -394,3 +394,235 @@
     kvm_log.info("VM resumed after S3")
 
     session.close()
+
+def run_ntp_server_setup(test, params, env):
+    +    """NTP server configuration and related network file 

modification

(quoted diff) +35 -0
+    """
+    kvm_log.debug("run ntp server setup")
+    status = 1
+    # stop firewall for NTP server if it is running.
+    status = os.system("/etc/init.d/iptables status")
+    if status == 0:
+        os.system("/etc/init.d/iptables stop")
+        status = 1
+
+    # prevent dhcp client modify the ntp.conf
+    kvm_log.info("prevent dhcp client modify the ntp.conf")
+
+    config_file = "/etc/sysconfig/network"
+    network_file = open("/etc/sysconfig/network", "a")
+    string = "PEERNTP=no"
+
+    if os.system("grep %s %s" % (string, config_file)):
+        network_file.writelines(str(string)+'\n')
+    +    network_file.close()
+  +    # start ntp server on host
+    kvm_log.info("backup ntp config file")
+
+    ntp_filename = os.path.expanduser("/etc/ntp.conf")
+    # backup ntp config file
+    backup_bootloader_filename = ntp_filename + "_backup"
+    if os.path.exists(ntp_filename):
+        os.rename(ntp_filename, backup_bootloader_filename)
+    +    status = os.system("/etc/init.d/ntpd status")
+    if status == 0:
+        os.system("/etc/init.d/ntpd stop")
+        status = 1    +
+    kvm_log.info("start ntp server on host")
+
+    ntp_cmd = '''
+        echo "restrict default kod nomodify notrap nopeer noquery" 
Quoted 1 line
Quoted 1 line

/etc/ntp.conf;\

Review

Quoted 7 lines
(quoted diff) +7 -0
+        echo "restrict 127.0.0.1" >> /etc/ntp.conf;\
+        echo "driftfile /var/lib/ntp/drift" >> /etc/ntp.conf;\
+        echo "keys /etc/ntp/keys" >> /etc/ntp.conf;\
+        echo "server 127.127.1.0" >> /etc/ntp.conf;\
+        echo "fudge 127.127.1.0 stratum 1" >> /etc/ntp.conf;\
+        service ntpd start;
+        '''

I think it would be better to copy /etc/ntp.conf to a temporary file, modify that, and start ntpd with the -c option.

After the test is finished, restart ntpd with the default config (if it was running) via service ntpd restart.

Also I don't see whether your script reports the content of

/sys/devices/system/clocksource/clocksource0/current_clocksource

On the guest? Its important that information is displayed on the test report.

Looks fine to me other than that, but the kvm-autotest guys probably have more comments.

Thanks

Signature · 3 lines
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
#4 lore raw
In reply to Bear Yang
Quoted 11 lines · Bear Yang

Hello.
I have modified my script according Marcelo's suggestion. and resubmit my script to you all. :)

Marcelo, Seems except you, no one care my script. I still want to say any suggestion on my script would be greatly appreciated.

Thanks.

Bear

Hi Bear, sorry, I had some hectic days here so I still haven't reviewed your patch.

As a general comment, I realize that in several occasions we are using os.system() to execute commands on the host, when we would usually prefer to use the utils.system() or utils.run() API, since it already throws an exception when exit code != 0 (you can allways set ignore_fail = True to avoid this behavior if needed) and we are working on doing a better handling of stdout and stderr upstream.

My comments follow:

cpu_stress.c +61 -0
diff -urN kvm_runtest_2.bak/cpu_stress.c kvm_runtest_2/cpu_stress.c
@@ -0,0 +1,61 @@
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <pthread.h>
+#include <sched.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <math.h>
+#include <unistd.h>
+
+#define MAX_CPUS 256
+#define BUFFSIZE 1024
+
+
+void worker_child(int cpu)
+{
+	int cur_freq;
+	int min_freq;
+	int max_freq;
+	int last_freq;
+	cpu_set_t mask;
+	int i;
+	double x;
+        int d = 0;
+	/*
+	 * bind this thread to the specified cpu 
+	 */
+	CPU_ZERO(&mask);
+	CPU_SET(cpu, &mask);
+	sched_setaffinity(0, CPU_SETSIZE, &mask);
+
+	while (d++ != 500000) {
+			for (i=0; i<100000; i++)
+				x = sqrt(x);
+	}
+
+	_exit(0);
+
+}
+
+
+main() {
+	cpu_set_t mask;
+	int i;
+	int code;
+
+	if (sched_getaffinity(0, CPU_SETSIZE, &mask) < 0){
+		perror ("sched_getaffinity");
+		exit(1);
+	}
+
+	for (i=0; i<CPU_SETSIZE; i++)
+		if (CPU_ISSET(i, &mask)){
+			printf ("CPU%d\n",i);
+			if (fork() == 0)
+				worker_child(i);
+		}
+
+
+	wait(&code);
+	exit (WEXITSTATUS(code));
+}

I believe we might want to use a more complete stress system, that can do IO stress and put 'memory pressure' on the host system. When I need to cause stress on a host, what I end up doing is to hack the stress.c program from LTP, because it can do memory and IO stress as well. I will send you the stress.c program on a separate e-mail.

kvm_runtest_2.py +2 -0
diff -urN kvm_runtest_2.bak/kvm_runtest_2.py kvm_runtest_2/kvm_runtest_2.py
@@ -36,6 +36,8 @@
                 "autotest":     test_routine("kvm_tests",           "run_autotest"),
                 "kvm_install":  test_routine("kvm_install",         "run_kvm_install"),
                 "linux_s3":     test_routine("kvm_tests",           "run_linux_s3"),
+                "ntp_server_setup": test_routine("kvm_tests",       "run_ntp_server_setup"),
+                "timedrift":    test_routine("kvm_tests",           "run_timedrift"),
                 }
 
         # Make it possible to import modules from the test's bindir
kvm_tests.cfg.sample +4 -0
diff -urN kvm_runtest_2.bak/kvm_tests.cfg.sample kvm_runtest_2/kvm_tests.cfg.sample
@@ -81,6 +81,10 @@
     - linux_s3:      install setup
         type = linux_s3
 
+    - ntp_server_setup:
+        type = ntp_server_setup
+    - timedrift:      ntp_server_setup
+        type = timedrift
 # NICs
 variants:
     - @rtl8139:
kvm_tests.py +43 -0

46 lines not on this page · raw message

Here you could have used regular utils.system API instead of os.system since it integrates better with the autotest infrastructure. Instead of the if clause we'd put a try/except block. Minor nipticking, "NTP server has not started correctly..."

+ #kvm_log.info("sync system clock to BIOS")
+ #os.system("/sbin/hwclock --systohc")
+
+def run_timedrift(test, params, env):
+ """judge wether the guest clock will encounter timedrift prblem or not. including three stages:

Typo, "whether"

+       1: try to sync the clock with host, if the offset value of guest clock is large than 1 sec.
+       2: running the cpu stress testing program<cpu_stress.c> on guest
+       3: then run analyze loop totally 20 times to determine if the clock on guest has time drift.
+    """
+    # variables using in timedrift testcase
+    cpu_stress_program = "cpu_stress.c"
+    remote_dir = '/root'
+
+    clock_resource_cmd = "cat /sys/devices/system/clocksource/clocksource0/current_clocksource"
+
+    pwd = os.path.join(os.environ['AUTODIR'],'tests/kvm_runtest_2')
+    cpu_stress_test = os.path.join(pwd, cpu_stress_program)
+    cpu_stress_cmdline = 'cd %s;gcc %s -lm;./a.out &' % (remote_dir, os.path.basename(cpu_stress_test))

+
+ cpu_stress_search_cmdline = "ps -ef|grep 'a.out'|grep -v grep"
+
+ hostname = os.environ.get("HOSTNAME")

Can't we use socket.gethostname() here instead of relying on environment variable values?

+ if "localhost.localdomain" == hostname:
+ hostname = os.popen('hostname').read().split('\n')[0]
+ kvm_log.info("since get wrong hostname from python evnironment, then use the hostname get from system call(hostname).")
+
+ kvm_log.info("get host name :%s" % hostname)
+

+    # ntpdate info command and ntpdate sync command
+    ntpdate_info_cmd = "ntpdate -q %s" % hostname
+    ntpdate_sync_cmd = "ntpdate %s" % hostname
+
+    # get vm handle
+    vm = kvm_utils.env_get_vm(env,params.get("main_vm"))
+    if not vm:

+ raise error.TestError, "VM object not found in environment"
+ if not vm.is_alive():
+ raise error.TestError, "VM seems to be dead; Test requires a living VM"

I am seeing this piece of code to get the VM handle on several tests, I am starting to think we should factor this on an utility function...

+ kvm_log.info("Waiting for guest to be up...")
+
+ pxssh = kvm_utils.wait_for(vm.ssh_login, 240, 0, 2)
+ if not pxssh:
+ raise error.TestFail, "Could not log into guest"
+
+ kvm_log.info("Logged into guest IN run_timedrift function.")
+

+    # clock resource get from host and guest
+    host_clock_resource = os.popen(clock_resource_cmd).read().split('\n')[0]
+    kvm_log.info("the clock resource on host is :%s" % host_clock_resource)
+
+    pxssh.sendline(clock_resource_cmd)
+    s, o = pxssh.read_up_to_prompt()
+    guest_clock_resource = o.splitlines()[-2]
+    kvm_log.info("the clock resource on guest is :%s" % guest_clock_resource)

+
+ if host_clock_resource != guest_clock_resource:
+ #raise error.TestFail, "Host and Guest using different clock resource"
+ kvm_log.info("Host and Guest using different clock resource,Let's moving on.")
+ else:
+ kvm_log.info("Host and Guest using same clock resource,Let's moving on.")

Little mistake here, "Let's move on."

+    # helper function: 
+    # ntpdate_op: a entire process to get ntpdate command line result from guest.
+    # time_drift_or_not: get the numeric handing by regular expression and make timedrift calulation.
+    def ntpdate_op(command):

+ output = []
+ try:
+ pxssh = kvm_utils.wait_for(vm.ssh_login, 240, 0, 2)
+ if not pxssh:
+ raise error.TestFail, "Could not log into guest"
+
+ kvm_log.info("Logged in:(ntpdate_op)")
+
+ while True:

+                pxssh.sendline(command)
+                s, output = pxssh.read_up_to_prompt()
+                if "time server" in output:

+ # output is a string contain the (ntpdate -q) infor on guest
+ return True, output
+ else:
+ continue
+ except:
+ pxssh.close()
+ return False, output
+ return False, output
+
+ def time_drift_or_not(output):

+        date_string = re.findall(r'offset [+-]?(.*) sec', output, re.M)
+        num = float(date_string[0])
+        if num >= 1:

+ kvm_log.info("guest clock has drifted in this scenario :%s %s" % (date_string, num))
+ return False
+ else:
+ kvm_log.info("guest clock running veracious in now stage :%s %s" % (date_string, num))
+ return True
+

+    # send the command and get the ouput from guest
+    # this loop will pick out several conditions need to be process
+    # Actually, we want to get the info match "time server", then script can analyzing it to
+    # determine if guest's clock need sync with host or not.
+    while True:
+        pxssh.sendline(ntpdate_info_cmd)
+        s, output = pxssh.read_up_to_prompt()
+        kvm_log.info("the ntpdate query info get from guest is below: \n%s" %output)
+        if ("no server suitable" not in output) and ("time server" not in output):
+            kvm_log.info("very creazying output got. let's try again")
+            continue
+        elif "no server suitable" in output:
+            kvm_log.info("seems NTP server is not ready for servicing")
+            time.sleep(30)
+            continue
+        elif "time server" in output:
+            # get the ntpdate info from guest
+            # kvm_log.info("Got the correct output for analyze. The output is below: \n%s" %output) 
+            break

+
+ kvm_log.info("get the ntpdate infomation from guest successfully :%s" % os.popen('date').read())
+
+ # judge the clock need to sync with host or not
+ while True:

+        date_string = re.findall(r'offset [+-]?(.*) sec', output, re.M)
+        num = float(date_string[0])
+        if num >= 1:
+            kvm_log.info("guest need sync with the server: %s" % hostname)
+            s, output = ntpdate_op(ntpdate_sync_cmd)
+            if s:

+ continue
+ else:
+ #pxssh.sendline("hwclock --systohc")
+ #kvm_log.info("guest clock sync prcdure is finished. then sync the guest clock to guest bios.")
+

+            #pxssh.sendline("hwclock --show")
+            #s, o = pxssh.read_up_to_prompt()
+            #kvm_log.info("the date infomation get from guest bios is :\n%s" % o)
+
+            pxssh.sendline(ntpdate_info_cmd)
+            s, o = pxssh.read_up_to_prompt()
+            kvm_log.info("guest clock after sync with host is :\n%s" % o)

+
+ break
+
+ kvm_log.info("Timedrift Preparation *Finished* at last :%s" % os.popen('date').read())
+
+ if not vm.scp_to_remote(cpu_stress_test, remote_dir):
+ raise error.TestError, "Could not copy program to guest."
+

+    pxssh.sendline(ntpdate_info_cmd)
+    s, o = pxssh.read_up_to_prompt()
+    kvm_log.info("the ntpdate query from host *BEFORE* running the cpu stress program.\n%s" % o)
+    pxssh.sendline(cpu_stress_cmdline)
+    s, o = pxssh.read_up_to_prompt()
+    kvm_log.info("running command line on guest and sleeping for 1200 secs.\n%s" % o)

+
+ time.sleep(1200)
+
+ while True:
+ if pxssh.get_command_status(cpu_stress_search_cmdline):

+            #(s, o) = pxssh.get_command_status_output(cpu_stress_search_cmdline)
+            #print "s is :%s" % s
+            #print "o is :%s" % o
+            #print "--------------------------------------------"
+            #aaa = pxssh.get_command_status(cpu_stress_search_cmdline)
+            #print "aaa is :%s" % aaa
+            #print "--------------------------------------------"

+
+ print "stress testing process has been completed and quit."
+ break
+ else:

+            print "stress testing on CPU has not finished yet.waiting for next detect after sleep 60 secs."
+            time.sleep(60)
+            continue
+
+    pxssh.sendline(ntpdate_info_cmd)
+    s, o = pxssh.read_up_to_prompt()
+    kvm_log.info("the ntpdate query from host *AFTER* running the cpu stress program.\n%s" % o)
+
+    pxssh.close()
+
+    # Sleep for analyze...
+    kvm_log.info("sleeping(180 secs) Starting... :%s" % os.popen('date').read())
+    time.sleep(180)
+    kvm_log.info("wakeup to get the analyzing... :%s" % os.popen('date').read())
+    count = 0
+    for i in range(1, 21):

+ kvm_log.info("this is %s time to get clock info from guest." % i)
+ s, o = ntpdate_op(ntpdate_info_cmd)
+
+ if not s:
+ raise error.TestFail, "Guest seems hang or ssh service based on guest has been crash down"
+
+ if not time_drift_or_not(o):
+ count += 1
+
+ if count == 5:
+ raise error.TestFail, "TimeDrift testing Abort because guest's clock has drift too much"
+
+ kvm_log.info("*********************** Sleep 30 seconds for next loop *************************")
+ time.sleep(60)
+

author
#5 lore raw

Hi Lucas:
First, I want to say really thanks for your kindly,carefully words and suggestions. now, I modified my scripts follow your opinions.
1. Add the genload to timedrift, but I am not sure whether it is right or not to add the information CVS relevant. If it is not necessary. I will remove them next time.
2. Replace the API os.system to utils.system
3. Replace the API os.environ.get('HOSTNAME') to socket.gethostname()
4. for the snippet of the code below:
+ if utils.system(ntp_cmd, ignore_status=True) != 0:
+ raise error.TestFail, "NTP server has not starting correctly..."

Your suggestion is "Instead of the if clause we'd put a try/except block", but I am not clear how to do it. Would you please give me some guides for this. Sorry.

Other thing about functional the clauses which to get vm handle below:

+    # get vm handle
+    vm = kvm_utils.env_get_vm(env,params.get("main_vm"))
+    if not vm:

+ raise error.TestError, "VM object not found in environment"
+ if not vm.is_alive():
+ raise error.TestError, "VM seems to be dead; Test requires a living VM"

I agree with you on this point, I remember that somebody to do this before. but seems upstream not accept his modification.

Have a good day

thanks.

Quoted 386 lines · Lucas Meneghel Rodrigues
Quoted 10 lines · Bear Yang

Hello.
I have modified my script according Marcelo's suggestion. and resubmit my script to you all. :)

Marcelo, Seems except you, no one care my script. I still want to say any suggestion on my script would be greatly appreciated.

Thanks.

Bear

Hi Bear, sorry, I had some hectic days here so I still haven't reviewed your patch.

As a general comment, I realize that in several occasions we are using os.system() to execute commands on the host, when we would usually prefer to use the utils.system() or utils.run() API, since it already throws an exception when exit code != 0 (you can allways set ignore_fail = True to avoid this behavior if needed) and we are working on doing a better handling of stdout and stderr upstream.

My comments follow:

diff -urN kvm_runtest_2.bak/cpu_stress.c kvm_runtest_2/cpu_stress.c

cpu_stress.c +61 -0
@@ -0,0 +1,61 @@
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <pthread.h>
+#include <sched.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <math.h>
+#include <unistd.h>
+
+#define MAX_CPUS 256
+#define BUFFSIZE 1024
+
+
+void worker_child(int cpu)
+{
+	int cur_freq;
+	int min_freq;
+	int max_freq;
+	int last_freq;
+	cpu_set_t mask;
+	int i;
+	double x;
+        int d = 0;
+	/*
+	 * bind this thread to the specified cpu 
+	 */
+	CPU_ZERO(&mask);
+	CPU_SET(cpu, &mask);
+	sched_setaffinity(0, CPU_SETSIZE, &mask);
+
+	while (d++ != 500000) {
+			for (i=0; i<100000; i++)
+				x = sqrt(x);
+	}
+
+	_exit(0);
+
+}
+
+
+main() {
+	cpu_set_t mask;
+	int i;
+	int code;
+
+	if (sched_getaffinity(0, CPU_SETSIZE, &mask) < 0){
+		perror ("sched_getaffinity");
+		exit(1);
+	}
+
+	for (i=0; i<CPU_SETSIZE; i++)
+		if (CPU_ISSET(i, &mask)){
+			printf ("CPU%d\n",i);
+			if (fork() == 0)
+				worker_child(i);
+		}
+
+
+	wait(&code);
+	exit (WEXITSTATUS(code));
+}

I believe we might want to use a more complete stress system, that can do IO stress and put 'memory pressure' on the host system. When I need to cause stress on a host, what I end up doing is to hack the stress.c program from LTP, because it can do memory and IO stress as well. I will send you the stress.c program on a separate e-mail.

diff -urN kvm_runtest_2.bak/kvm_runtest_2.py kvm_runtest_2/kvm_runtest_2.py

kvm_runtest_2.py +2 -0
@@ -36,6 +36,8 @@
                 "autotest":     test_routine("kvm_tests",           "run_autotest"),
                 "kvm_install":  test_routine("kvm_install",         "run_kvm_install"),
                 "linux_s3":     test_routine("kvm_tests",           "run_linux_s3"),
+                "ntp_server_setup": test_routine("kvm_tests",       "run_ntp_server_setup"),
+                "timedrift":    test_routine("kvm_tests",           "run_timedrift"),
                 }
 
         # Make it possible to import modules from the test's bindir

diff -urN kvm_runtest_2.bak/kvm_tests.cfg.sample kvm_runtest_2/kvm_tests.cfg.sample

kvm_tests.cfg.sample +4 -0
@@ -81,6 +81,10 @@
     - linux_s3:      install setup
         type = linux_s3
 
+    - ntp_server_setup:
+        type = ntp_server_setup
+    - timedrift:      ntp_server_setup
+        type = timedrift
 # NICs
 variants:
     - @rtl8139:

diff -urN kvm_runtest_2.bak/kvm_tests.py kvm_runtest_2/kvm_tests.py

kvm_tests.py +43 -0
@@ -394,3 +394,247 @@
     kvm_log.info("VM resumed after S3")
 
     session.close()
+
+def run_ntp_server_setup(test, params, env):
+    
+    """NTP server configuration and related network file modification
+    """
+
+    kvm_log.info("stop the iptables service if it is running for timedrift testing")
+
+    if not os.system("/etc/init.d/iptables status"):
+        os.system("/etc/init.d/iptables stop")
+
+    # prevent dhcp client modify the ntp.conf
+    kvm_log.info("prevent dhcp client modify the ntp.conf")
+
+    config_file = "/etc/sysconfig/network"
+    network_file = open("/etc/sysconfig/network", "a")
+    string = "PEERNTP=no"
+
+    if os.system("grep %s %s" % (string, config_file)):
+        network_file.writelines(str(string)+'\n')
+    
+    network_file.close()
+  
+    # stop the ntp service if it is running
+    kvm_log.info("stop ntp service if it is running")
+
+    if not os.system("/etc/init.d/ntpd status"):
+        os.system("/etc/init.d/ntpd stop")
+        ntp_running = True
+
+    kvm_log.info("start ntp server on host with the custom config file.")
+
+    ntp_cmd = '''
+        echo "restrict default kod nomodify notrap nopeer noquery" >> /etc/timedrift.ntp.conf;\
+        echo "restrict 127.0.0.1" >> /etc/timedrift.ntp.conf;\
+        echo "driftfile /var/lib/ntp/drift" >> /etc/timedrift.ntp.conf;\
+        echo "keys /etc/ntp/keys" >> /etc/timedrift.ntp.conf;\
+        echo "server 127.127.1.0" >> /etc/timedrift.ntp.conf;\
+        echo "fudge 127.127.1.0 stratum 1" >> /etc/timedrift.ntp.conf;\
+        ntpd -c /etc/timedrift.ntp.conf;
+        '''
+    if os.system(ntp_cmd):
+        raise error.TestFail, "NTP server has not starting correct..."

Here you could have used regular utils.system API instead of os.system since it integrates better with the autotest infrastructure. Instead of the if clause we'd put a try/except block. Minor nipticking, "NTP server has not started correctly..."

kvm_tests.py +5 -0
+    #kvm_log.info("sync system clock to BIOS")
+    #os.system("/sbin/hwclock --systohc")
+   
+def run_timedrift(test, params, env):
+    """judge wether the guest clock will encounter timedrift prblem or not. including three stages:

Typo, "whether"

kvm_tests.py +17 -0
+       1: try to sync the clock with host, if the offset value of guest clock is large than 1 sec.
+       2: running the cpu stress testing program<cpu_stress.c> on guest
+       3: then run analyze loop totally 20 times to determine if the clock on guest has time drift.
+    """
+    # variables using in timedrift testcase
+    cpu_stress_program = "cpu_stress.c"
+    remote_dir = '/root'
+
+    clock_resource_cmd = "cat /sys/devices/system/clocksource/clocksource0/current_clocksource"
+
+    pwd = os.path.join(os.environ['AUTODIR'],'tests/kvm_runtest_2')
+    cpu_stress_test = os.path.join(pwd, cpu_stress_program)
+    cpu_stress_cmdline = 'cd %s;gcc %s -lm;./a.out &' % (remote_dir, os.path.basename(cpu_stress_test))
+
+    cpu_stress_search_cmdline = "ps -ef|grep 'a.out'|grep -v grep"
+
+    hostname = os.environ.get("HOSTNAME")

Can't we use socket.gethostname() here instead of relying on environment variable values?

kvm_tests.py +16 -0
+    if "localhost.localdomain" == hostname:
+        hostname = os.popen('hostname').read().split('\n')[0]
+        kvm_log.info("since get wrong hostname from python evnironment, then use the hostname get from system call(hostname).")
+
+    kvm_log.info("get host name :%s" % hostname)
+
+    # ntpdate info command and ntpdate sync command
+    ntpdate_info_cmd = "ntpdate -q %s" % hostname
+    ntpdate_sync_cmd = "ntpdate %s" % hostname
+
+    # get vm handle
+    vm = kvm_utils.env_get_vm(env,params.get("main_vm"))
+    if not vm:
+        raise error.TestError, "VM object not found in environment"
+    if not vm.is_alive():
+        raise error.TestError, "VM seems to be dead; Test requires a living VM"

I am seeing this piece of code to get the VM handle on several tests, I am starting to think we should factor this on an utility function...

kvm_tests.py +22 -0
+    kvm_log.info("Waiting for guest to be up...")
+
+    pxssh = kvm_utils.wait_for(vm.ssh_login, 240, 0, 2)
+    if not pxssh:
+        raise error.TestFail, "Could not log into guest"
+
+    kvm_log.info("Logged into guest IN run_timedrift function.")
+
+    # clock resource get from host and guest
+    host_clock_resource = os.popen(clock_resource_cmd).read().split('\n')[0]
+    kvm_log.info("the clock resource on host is :%s" % host_clock_resource)
+
+    pxssh.sendline(clock_resource_cmd)
+    s, o = pxssh.read_up_to_prompt()
+    guest_clock_resource = o.splitlines()[-2]
+    kvm_log.info("the clock resource on guest is :%s" % guest_clock_resource)
+
+    if host_clock_resource != guest_clock_resource:
+        #raise error.TestFail, "Host and Guest using different clock resource"
+        kvm_log.info("Host and Guest using different clock resource,Let's moving on.")
+    else:
+        kvm_log.info("Host and Guest using same clock resource,Let's moving on.")

Little mistake here, "Let's move on."

kvm_tests.py +138 -0
+    # helper function: 
+    # ntpdate_op: a entire process to get ntpdate command line result from guest.
+    # time_drift_or_not: get the numeric handing by regular expression and make timedrift calulation.
+    def ntpdate_op(command):
+        output = []
+        try:
+            pxssh = kvm_utils.wait_for(vm.ssh_login, 240, 0, 2)
+            if not pxssh:
+                raise error.TestFail, "Could not log into guest"
+
+            kvm_log.info("Logged in:(ntpdate_op)")
+
+            while True:
+                pxssh.sendline(command)
+                s, output = pxssh.read_up_to_prompt()
+                if "time server" in output:
+                    # output is a string contain the (ntpdate -q) infor on guest
+                    return True, output
+                else:
+                    continue
+        except:
+            pxssh.close()
+            return False, output
+        return False, output
+
+    def time_drift_or_not(output):
+        date_string = re.findall(r'offset [+-]?(.*) sec', output, re.M)
+        num = float(date_string[0])
+        if num >= 1:
+            kvm_log.info("guest clock has drifted in this scenario :%s %s" % (date_string, num))
+            return False
+        else:
+            kvm_log.info("guest clock running veracious in now stage :%s %s" % (date_string, num))
+            return True
+
+    # send the command and get the ouput from guest
+    # this loop will pick out several conditions need to be process
+    # Actually, we want to get the info match "time server", then script can analyzing it to
+    # determine if guest's clock need sync with host or not.
+    while True:
+        pxssh.sendline(ntpdate_info_cmd)
+        s, output = pxssh.read_up_to_prompt()
+        kvm_log.info("the ntpdate query info get from guest is below: \n%s" %output)
+        if ("no server suitable" not in output) and ("time server" not in output):
+            kvm_log.info("very creazying output got. let's try again")
+            continue
+        elif "no server suitable" in output:
+            kvm_log.info("seems NTP server is not ready for servicing")
+            time.sleep(30)
+            continue
+        elif "time server" in output:
+            # get the ntpdate info from guest
+            # kvm_log.info("Got the correct output for analyze. The output is below: \n%s" %output) 
+            break
+
+    kvm_log.info("get the ntpdate infomation from guest successfully :%s" % os.popen('date').read())
+
+    # judge the clock need to sync with host or not
+    while True:
+        date_string = re.findall(r'offset [+-]?(.*) sec', output, re.M)
+        num = float(date_string[0])
+        if num >= 1:
+            kvm_log.info("guest need sync with the server: %s" % hostname)
+            s, output = ntpdate_op(ntpdate_sync_cmd)
+            if s:
+                continue
+        else:
+            #pxssh.sendline("hwclock --systohc")
+            #kvm_log.info("guest clock sync prcdure is finished. then sync the guest clock to guest bios.")
+
+            #pxssh.sendline("hwclock --show")
+            #s, o = pxssh.read_up_to_prompt()
+            #kvm_log.info("the date infomation get from guest bios is :\n%s" % o)
+
+            pxssh.sendline(ntpdate_info_cmd)
+            s, o = pxssh.read_up_to_prompt()
+            kvm_log.info("guest clock after sync with host is :\n%s" % o)
+
+            break
+
+    kvm_log.info("Timedrift Preparation *Finished* at last :%s" % os.popen('date').read())
+
+    if not vm.scp_to_remote(cpu_stress_test, remote_dir):
+        raise error.TestError, "Could not copy program to guest."
+
+    pxssh.sendline(ntpdate_info_cmd)
+    s, o = pxssh.read_up_to_prompt()
+    kvm_log.info("the ntpdate query from host *BEFORE* running the cpu stress program.\n%s" % o)
+    pxssh.sendline(cpu_stress_cmdline)
+    s, o = pxssh.read_up_to_prompt()
+    kvm_log.info("running command line on guest and sleeping for 1200 secs.\n%s" % o)
+
+    time.sleep(1200)
+
+    while True:
+        if pxssh.get_command_status(cpu_stress_search_cmdline):
+            #(s, o) = pxssh.get_command_status_output(cpu_stress_search_cmdline)
+            #print "s is :%s" % s
+            #print "o is :%s" % o
+            #print "--------------------------------------------"
+            #aaa = pxssh.get_command_status(cpu_stress_search_cmdline)
+            #print "aaa is :%s" % aaa
+            #print "--------------------------------------------"
+
+            print "stress testing process has been completed and quit."
+            break
+        else:
+            print "stress testing on CPU has not finished yet.waiting for next detect after sleep 60 secs."
+            time.sleep(60)
+            continue
+
+    pxssh.sendline(ntpdate_info_cmd)
+    s, o = pxssh.read_up_to_prompt()
+    kvm_log.info("the ntpdate query from host *AFTER* running the cpu stress program.\n%s" % o)
+
+    pxssh.close()
+
+    # Sleep for analyze...
+    kvm_log.info("sleeping(180 secs) Starting... :%s" % os.popen('date').read())
+    time.sleep(180)
+    kvm_log.info("wakeup to get the analyzing... :%s" % os.popen('date').read())
+    count = 0
+    for i in range(1, 21):
+        kvm_log.info("this is %s time to get clock info from guest." % i)
+        s, o = ntpdate_op(ntpdate_info_cmd)
+        
+        if not s:
+            raise error.TestFail, "Guest seems hang or ssh service based on guest has been crash down"
+        
+        if not time_drift_or_not(o):
+            count += 1
+
+        if count == 5:
+            raise error.TestFail, "TimeDrift testing Abort because guest's clock has drift too much"
+
+        kvm_log.info("*********************** Sleep 30 seconds for next loop *************************")
+        time.sleep(60)
+
author
#6 lore raw

Sorry forgot to attach my new patch.

Quoted 451 lines · Bear Yang

Hi Lucas:
First, I want to say really thanks for your kindly,carefully words and suggestions. now, I modified my scripts follow your opinions.
1. Add the genload to timedrift, but I am not sure whether it is right or not to add the information CVS relevant. If it is not necessary. I will remove them next time.
2. Replace the API os.system to utils.system
3. Replace the API os.environ.get('HOSTNAME') to socket.gethostname()
4. for the snippet of the code below:

(quoted diff) +2 -0
+    if utils.system(ntp_cmd, ignore_status=True) != 0:
+        raise error.TestFail, "NTP server has not starting correctly..."

Your suggestion is "Instead of the if clause we'd put a try/except block", but I am not clear how to do it. Would you please give me some guides for this. Sorry.

Other thing about functional the clauses which to get vm handle below:

(quoted diff) +6 -0
+    # get vm handle
+    vm = kvm_utils.env_get_vm(env,params.get("main_vm"))
+    if not vm:
+        raise error.TestError, "VM object not found in environment"
+    if not vm.is_alive():
+        raise error.TestError, "VM seems to be dead; Test requires a 

living VM"

I agree with you on this point, I remember that somebody to do this before. but seems upstream not accept his modification.

Have a good day

thanks.

Quoted 422 lines · Lucas Meneghel Rodrigues
Quoted 10 lines · Bear Yang

Hello.
I have modified my script according Marcelo's suggestion. and resubmit my script to you all. :)

Marcelo, Seems except you, no one care my script. I still want to say any suggestion on my script would be greatly appreciated.

Thanks.

Bear

Hi Bear, sorry, I had some hectic days here so I still haven't reviewed your patch.
As a general comment, I realize that in several occasions we are using os.system() to execute commands on the host, when we would usually prefer to use the utils.system() or utils.run() API, since it already throws an exception when exit code != 0 (you can allways set ignore_fail = True to avoid this behavior if needed) and we are working on doing a better handling of stdout and stderr upstream.

My comments follow:

diff -urN kvm_runtest_2.bak/cpu_stress.c kvm_runtest_2/cpu_stress.c
--- kvm_runtest_2.bak/cpu_stress.c 1969-12-31 19:00:00.000000000
-0500
+++ kvm_runtest_2/cpu_stress.c 2009-05-05 22:35:34.000000000 -0400

(quoted diff) +60 -0
@@ -0,0 +1,61 @@
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <pthread.h>
+#include <sched.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <math.h>
+#include <unistd.h>
+
+#define MAX_CPUS 256
+#define BUFFSIZE 1024
+
+
+void worker_child(int cpu)
+{
+    int cur_freq;
+    int min_freq;
+    int max_freq;
+    int last_freq;
+    cpu_set_t mask;
+    int i;
+    double x;
+        int d = 0;
+    /*
+     * bind this thread to the specified cpu +     */
+    CPU_ZERO(&mask);
+    CPU_SET(cpu, &mask);
+    sched_setaffinity(0, CPU_SETSIZE, &mask);
+
+    while (d++ != 500000) {
+            for (i=0; i<100000; i++)
+                x = sqrt(x);
+    }
+
+    _exit(0);
+
+}
+
+
+main() {
+    cpu_set_t mask;
+    int i;
+    int code;
+
+    if (sched_getaffinity(0, CPU_SETSIZE, &mask) < 0){
+        perror ("sched_getaffinity");
+        exit(1);
+    }
+
+    for (i=0; i<CPU_SETSIZE; i++)
+        if (CPU_ISSET(i, &mask)){
+            printf ("CPU%d\n",i);
+            if (fork() == 0)
+                worker_child(i);
+        }
+
+
+    wait(&code);
+    exit (WEXITSTATUS(code));
+}

I believe we might want to use a more complete stress system, that can do IO stress and put 'memory pressure' on the host system. When I need to cause stress on a host, what I end up doing is to hack the stress.c program from LTP, because it can do memory and IO stress as well. I will send you the stress.c program on a separate e-mail.

diff -urN kvm_runtest_2.bak/kvm_runtest_2.py kvm_runtest_2/kvm_runtest_2.py
--- kvm_runtest_2.bak/kvm_runtest_2.py 2009-04-29
06:17:29.000000000 -0400
+++ kvm_runtest_2/kvm_runtest_2.py 2009-04-29 08:06:32.000000000
-0400

(quoted diff) +1 -0
@@ -36,6 +36,8 @@
                 "autotest":     test_routine("kvm_tests",           
 "run_autotest"),
                 "kvm_install":  test_routine("kvm_install",         
 "run_kvm_install"),
                 "linux_s3":     test_routine("kvm_tests",           
 "run_linux_s3"),
+                "ntp_server_setup": test_routine("kvm_tests",       

"run_ntp_server_setup"),
+ "timedrift": test_routine("kvm_tests",
"run_timedrift"),
}

# Make it possible to import modules from the test's bindir
diff -urN kvm_runtest_2.bak/kvm_tests.cfg.sample kvm_runtest_2/kvm_tests.cfg.sample
--- kvm_runtest_2.bak/kvm_tests.cfg.sample 2009-04-29
06:17:29.000000000 -0400
+++ kvm_runtest_2/kvm_tests.cfg.sample 2009-04-29
08:09:36.000000000 -0400

(quoted diff) +4 -0
@@ -81,6 +81,10 @@
     - linux_s3:      install setup
         type = linux_s3
 
+    - ntp_server_setup:
+        type = ntp_server_setup
+    - timedrift:      ntp_server_setup
+        type = timedrift
 # NICs
 variants:
     - @rtl8139:

diff -urN kvm_runtest_2.bak/kvm_tests.py kvm_runtest_2/kvm_tests.py
--- kvm_runtest_2.bak/kvm_tests.py 2009-04-29 06:17:29.000000000
-0400
+++ kvm_runtest_2/kvm_tests.py 2009-05-11 06:00:32.000000000 -0400

(quoted diff) +3 -0
@@ -394,3 +394,247 @@
     kvm_log.info("VM resumed after S3")
 
     session.close()
+
+def run_ntp_server_setup(test, params, env):
+    +    """NTP server configuration and related network file 

modification

(quoted diff) +3 -0
+    """
+
+    kvm_log.info("stop the iptables service if it is running for 

timedrift testing")

(quoted diff) +22 -0
+
+    if not os.system("/etc/init.d/iptables status"):
+        os.system("/etc/init.d/iptables stop")
+
+    # prevent dhcp client modify the ntp.conf
+    kvm_log.info("prevent dhcp client modify the ntp.conf")
+
+    config_file = "/etc/sysconfig/network"
+    network_file = open("/etc/sysconfig/network", "a")
+    string = "PEERNTP=no"
+
+    if os.system("grep %s %s" % (string, config_file)):
+        network_file.writelines(str(string)+'\n')
+    +    network_file.close()
+  +    # stop the ntp service if it is running
+    kvm_log.info("stop ntp service if it is running")
+
+    if not os.system("/etc/init.d/ntpd status"):
+        os.system("/etc/init.d/ntpd stop")
+        ntp_running = True
+
+    kvm_log.info("start ntp server on host with the custom config 

file.")

(quoted diff) +3 -0
+
+    ntp_cmd = '''
+        echo "restrict default kod nomodify notrap nopeer noquery" 
Quoted 1 line
Quoted 1 line

/etc/timedrift.ntp.conf;\

(quoted diff) +2 -0
+        echo "restrict 127.0.0.1" >> /etc/timedrift.ntp.conf;\
+        echo "driftfile /var/lib/ntp/drift" >> 

/etc/timedrift.ntp.conf;\

(quoted diff) +7 -0
+        echo "keys /etc/ntp/keys" >> /etc/timedrift.ntp.conf;\
+        echo "server 127.127.1.0" >> /etc/timedrift.ntp.conf;\
+        echo "fudge 127.127.1.0 stratum 1" >> /etc/timedrift.ntp.conf;\
+        ntpd -c /etc/timedrift.ntp.conf;
+        '''
+    if os.system(ntp_cmd):
+        raise error.TestFail, "NTP server has not starting correct..."

Here you could have used regular utils.system API instead of os.system since it integrates better with the autotest infrastructure. Instead of the if clause we'd put a try/except block. Minor nipticking, "NTP server has not started correctly..."

(quoted diff) +4 -0
+    #kvm_log.info("sync system clock to BIOS")
+    #os.system("/sbin/hwclock --systohc")
+   +def run_timedrift(test, params, env):
+    """judge wether the guest clock will encounter timedrift prblem 

or not. including three stages:

Typo, "whether"

+ 1: try to sync the clock with host, if the offset value of
guest clock is large than 1 sec.

(quoted diff) +2 -0
+       2: running the cpu stress testing program<cpu_stress.c> on guest
+       3: then run analyze loop totally 20 times to determine if the 

clock on guest has time drift.

(quoted diff) +6 -0
+    """
+    # variables using in timedrift testcase
+    cpu_stress_program = "cpu_stress.c"
+    remote_dir = '/root'
+
+    clock_resource_cmd = "cat 

/sys/devices/system/clocksource/clocksource0/current_clocksource"

(quoted diff) +4 -0
+
+    pwd = os.path.join(os.environ['AUTODIR'],'tests/kvm_runtest_2')
+    cpu_stress_test = os.path.join(pwd, cpu_stress_program)
+    cpu_stress_cmdline = 'cd %s;gcc %s -lm;./a.out &' % (remote_dir, 

os.path.basename(cpu_stress_test))

(quoted diff) +4 -0
+
+    cpu_stress_search_cmdline = "ps -ef|grep 'a.out'|grep -v grep"
+
+    hostname = os.environ.get("HOSTNAME")

Can't we use socket.gethostname() here instead of relying on environment variable values?

(quoted diff) +3 -0
+    if "localhost.localdomain" == hostname:
+        hostname = os.popen('hostname').read().split('\n')[0]
+        kvm_log.info("since get wrong hostname from python 

evnironment, then use the hostname get from system call(hostname).")

(quoted diff) +13 -0
+
+    kvm_log.info("get host name :%s" % hostname)
+
+    # ntpdate info command and ntpdate sync command
+    ntpdate_info_cmd = "ntpdate -q %s" % hostname
+    ntpdate_sync_cmd = "ntpdate %s" % hostname
+
+    # get vm handle
+    vm = kvm_utils.env_get_vm(env,params.get("main_vm"))
+    if not vm:
+        raise error.TestError, "VM object not found in environment"
+    if not vm.is_alive():
+        raise error.TestError, "VM seems to be dead; Test requires a 

living VM"

I am seeing this piece of code to get the VM handle on several tests, I am starting to think we should factor this on an utility function...

(quoted diff) +10 -0
+    kvm_log.info("Waiting for guest to be up...")
+
+    pxssh = kvm_utils.wait_for(vm.ssh_login, 240, 0, 2)
+    if not pxssh:
+        raise error.TestFail, "Could not log into guest"
+
+    kvm_log.info("Logged into guest IN run_timedrift function.")
+
+    # clock resource get from host and guest
+    host_clock_resource = 

os.popen(clock_resource_cmd).read().split('\n')[0]
+ kvm_log.info("the clock resource on host is :%s" %
host_clock_resource)

(quoted diff) +5 -0
+
+    pxssh.sendline(clock_resource_cmd)
+    s, o = pxssh.read_up_to_prompt()
+    guest_clock_resource = o.splitlines()[-2]
+    kvm_log.info("the clock resource on guest is :%s" % 

guest_clock_resource)

(quoted diff) +3 -0
+
+    if host_clock_resource != guest_clock_resource:
+        #raise error.TestFail, "Host and Guest using different clock 

resource"
+ kvm_log.info("Host and Guest using different clock
resource,Let's moving on.")

(quoted diff) +2 -0
+    else:
+        kvm_log.info("Host and Guest using same clock resource,Let's 

moving on.")

Little mistake here, "Let's move on."

+ # helper function: + # ntpdate_op: a entire process to get
ntpdate command line result from guest.
+ # time_drift_or_not: get the numeric handing by regular
expression and make timedrift calulation.

(quoted diff) +14 -0
+    def ntpdate_op(command):
+        output = []
+        try:
+            pxssh = kvm_utils.wait_for(vm.ssh_login, 240, 0, 2)
+            if not pxssh:
+                raise error.TestFail, "Could not log into guest"
+
+            kvm_log.info("Logged in:(ntpdate_op)")
+
+            while True:
+                pxssh.sendline(command)
+                s, output = pxssh.read_up_to_prompt()
+                if "time server" in output:
+                    # output is a string contain the (ntpdate -q) 

infor on guest

(quoted diff) +13 -0
+                    return True, output
+                else:
+                    continue
+        except:
+            pxssh.close()
+            return False, output
+        return False, output
+
+    def time_drift_or_not(output):
+        date_string = re.findall(r'offset [+-]?(.*) sec', output, re.M)
+        num = float(date_string[0])
+        if num >= 1:
+            kvm_log.info("guest clock has drifted in this scenario 

:%s %s" % (date_string, num))

(quoted diff) +3 -0
+            return False
+        else:
+            kvm_log.info("guest clock running veracious in now stage 

:%s %s" % (date_string, num))

(quoted diff) +5 -0
+            return True
+
+    # send the command and get the ouput from guest
+    # this loop will pick out several conditions need to be process
+    # Actually, we want to get the info match "time server", then 

script can analyzing it to

(quoted diff) +5 -0
+    # determine if guest's clock need sync with host or not.
+    while True:
+        pxssh.sendline(ntpdate_info_cmd)
+        s, output = pxssh.read_up_to_prompt()
+        kvm_log.info("the ntpdate query info get from guest is 

below: \n%s" %output)
+ if ("no server suitable" not in output) and ("time server"
not in output):

(quoted diff) +9 -0
+            kvm_log.info("very creazying output got. let's try again")
+            continue
+        elif "no server suitable" in output:
+            kvm_log.info("seems NTP server is not ready for servicing")
+            time.sleep(30)
+            continue
+        elif "time server" in output:
+            # get the ntpdate info from guest
+            # kvm_log.info("Got the correct output for analyze. The 

output is below: \n%s" %output) + break

(quoted diff) +2 -0
+
+    kvm_log.info("get the ntpdate infomation from guest successfully 

:%s" % os.popen('date').read())

(quoted diff) +7 -0
+
+    # judge the clock need to sync with host or not
+    while True:
+        date_string = re.findall(r'offset [+-]?(.*) sec', output, re.M)
+        num = float(date_string[0])
+        if num >= 1:
+            kvm_log.info("guest need sync with the server: %s" % 

hostname)

(quoted diff) +6 -0
+            s, output = ntpdate_op(ntpdate_sync_cmd)
+            if s:
+                continue
+        else:
+            #pxssh.sendline("hwclock --systohc")
+            #kvm_log.info("guest clock sync prcdure is finished. 

then sync the guest clock to guest bios.")

(quoted diff) +4 -0
+
+            #pxssh.sendline("hwclock --show")
+            #s, o = pxssh.read_up_to_prompt()
+            #kvm_log.info("the date infomation get from guest bios 

is :\n%s" % o)

(quoted diff) +4 -0
+
+            pxssh.sendline(ntpdate_info_cmd)
+            s, o = pxssh.read_up_to_prompt()
+            kvm_log.info("guest clock after sync with host is :\n%s" 

% o)

(quoted diff) +4 -0
+
+            break
+
+    kvm_log.info("Timedrift Preparation *Finished* at last :%s" % 

os.popen('date').read())

(quoted diff) +7 -0
+
+    if not vm.scp_to_remote(cpu_stress_test, remote_dir):
+        raise error.TestError, "Could not copy program to guest."
+
+    pxssh.sendline(ntpdate_info_cmd)
+    s, o = pxssh.read_up_to_prompt()
+    kvm_log.info("the ntpdate query from host *BEFORE* running the 

cpu stress program.\n%s" % o)

(quoted diff) +3 -0
+    pxssh.sendline(cpu_stress_cmdline)
+    s, o = pxssh.read_up_to_prompt()
+    kvm_log.info("running command line on guest and sleeping for 

1200 secs.\n%s" % o)

(quoted diff) +6 -0
+
+    time.sleep(1200)
+
+    while True:
+        if pxssh.get_command_status(cpu_stress_search_cmdline):
+            #(s, o) = 

pxssh.get_command_status_output(cpu_stress_search_cmdline)

(quoted diff) +11 -0
+            #print "s is :%s" % s
+            #print "o is :%s" % o
+            #print "--------------------------------------------"
+            #aaa = pxssh.get_command_status(cpu_stress_search_cmdline)
+            #print "aaa is :%s" % aaa
+            #print "--------------------------------------------"
+
+            print "stress testing process has been completed and quit."
+            break
+        else:
+            print "stress testing on CPU has not finished 

yet.waiting for next detect after sleep 60 secs."

(quoted diff) +6 -0
+            time.sleep(60)
+            continue
+
+    pxssh.sendline(ntpdate_info_cmd)
+    s, o = pxssh.read_up_to_prompt()
+    kvm_log.info("the ntpdate query from host *AFTER* running the 

cpu stress program.\n%s" % o)

(quoted diff) +5 -0
+
+    pxssh.close()
+
+    # Sleep for analyze...
+    kvm_log.info("sleeping(180 secs) Starting... :%s" % 

os.popen('date').read())

(quoted diff) +2 -0
+    time.sleep(180)
+    kvm_log.info("wakeup to get the analyzing... :%s" % 

os.popen('date').read())

(quoted diff) +3 -0
+    count = 0
+    for i in range(1, 21):
+        kvm_log.info("this is %s time to get clock info from guest." 

% i)

(quoted diff) +3 -0
+        s, o = ntpdate_op(ntpdate_info_cmd)
+        +        if not s:
+            raise error.TestFail, "Guest seems hang or ssh service 

based on guest has been crash down"

(quoted diff) +5 -0
+        +        if not time_drift_or_not(o):
+            count += 1
+
+        if count == 5:
+            raise error.TestFail, "TimeDrift testing Abort because 
Quoted 13 lines
Quoted 8 lines

guest's clock has drift too much"

(quoted diff) +2 -0
+
+        kvm_log.info("*********************** Sleep 30 seconds for 

next loop *************************")

(quoted diff) +2 -0
+        time.sleep(60)
+
Signature · 3 lines
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
genload/CVS/Entries +3 -0
diff -urN kvm_runtest_2.bak/genload/CVS/Entries kvm_runtest_2/genload/CVS/Entries
@@ -0,0 +1,3 @@
+/Makefile/1.4/Mon Sep 29 16:22:14 2008//
+/README/1.1/Fri Dec 13 21:34:13 2002//
+/stress.c/1.3/Thu Jul 26 12:40:17 2007//
genload/CVS/Repository +1 -0
diff -urN kvm_runtest_2.bak/genload/CVS/Repository kvm_runtest_2/genload/CVS/Repository
@@ -0,0 +1 @@
+ltp/tools/genload
genload/CVS/Root +1 -0
diff -urN kvm_runtest_2.bak/genload/CVS/Root kvm_runtest_2/genload/CVS/Root
@@ -0,0 +1 @@
+:pserver:[email protected]:/cvsroot/ltp
genload/Makefile +14 -0
diff -urN kvm_runtest_2.bak/genload/Makefile kvm_runtest_2/genload/Makefile
@@ -0,0 +1,14 @@
+CFLAGS+= -DPACKAGE=\"stress\" -DVERSION=\"0.17pre11\" 
+
+LDLIBS+= -lm
+
+SRCS=$(wildcard *.c)
+TARGETS=$(patsubst %.c,%,$(SRCS))
+
+all: $(TARGETS)
+
+install:
+	@ln -f $(TARGETS) ../../testcases/bin/genload
+
+clean:
+	rm -fr $(TARGETS)
genload/README +72 -0

72 lines not on this page · raw message

genload/stress.c +983 -0

983 lines not on this page · raw message

kvm_runtest_2.py +2 -0
diff -urN kvm_runtest_2.bak/kvm_runtest_2.py kvm_runtest_2/kvm_runtest_2.py
@@ -36,6 +36,8 @@
                 "autotest":     test_routine("kvm_tests",           "run_autotest"),
                 "kvm_install":  test_routine("kvm_install",         "run_kvm_install"),
                 "linux_s3":     test_routine("kvm_tests",           "run_linux_s3"),
+                "ntp_server_setup": test_routine("kvm_tests",       "run_ntp_server_setup"),
+                "timedrift":    test_routine("kvm_tests",           "run_timedrift"),
                 }
 
         # Make it possible to import modules from the test's bindir
kvm_tests.cfg.sample +5 -0
diff -urN kvm_runtest_2.bak/kvm_tests.cfg.sample kvm_runtest_2/kvm_tests.cfg.sample
@@ -81,6 +81,11 @@
     - linux_s3:      install setup
         type = linux_s3
 
+    - ntp_server_setup:
+        type = ntp_server_setup
+    - timedrift:      ntp_server_setup
+        type = timedrift
+        stress_test_specify = './stress -c 10 --timeout 15m'
 # NICs
 variants:
     - @rtl8139:
kvm_tests.py +260 -0

263 lines not on this page · raw message

#7 lore raw
Quoted 8 lines · Bear Yang

Sorry forgot to attach my new patch.

Quoted 6 lines · Bear Yang

Hi Lucas:
First, I want to say really thanks for your kindly,carefully words and suggestions. now, I modified my scripts follow your opinions.
1. Add the genload to timedrift, but I am not sure whether it is right or not to add the information CVS relevant. If it is not necessary. I will remove them next time.

Yes, we can remove the CVS related info, they just got mailed to you because I got the code from a fresh LTP CVS checkout!

Quoted 9 lines
Quoted 9 lines

2. Replace the API os.system to utils.system
3. Replace the API os.environ.get('HOSTNAME') to socket.gethostname()
4. for the snippet of the code below:

kvm_tests.py +2 -0
+    if utils.system(ntp_cmd, ignore_status=True) != 0:
+        raise error.TestFail, "NTP server has not starting correctly..."

Your suggestion is "Instead of the if clause we'd put a try/except block", but I am not clear how to do it. Would you please give me some guides for this. Sorry.

You could re-write the above if statement using the form:

try:
utils.system(ntp_cmd)
except:
raise error.TestFail("NTP server has not started correctly")

Some comments:

1) The try/except block works because utils.system already throws an
exception when the exit code is different from 0.
2) The form

raise error.TestFail("NTP server has not started correctly")

Is preferred on the upstream project over the equivalent

raise error.TestFail, "NTP server has not started correctly"

But on kvm autotest we are adopting the later, so don't worry and keep the all the raises the way they are on your original patch. This was just a side comment.

Quoted 10 lines
Quoted 10 lines

Other thing about functional the clauses which to get vm handle below:

kvm_tests.py +6 -0
+    # get vm handle
+    vm = kvm_utils.env_get_vm(env,params.get("main_vm"))
+    if not vm:
+        raise error.TestError, "VM object not found in environment"
+    if not vm.is_alive():
+        raise error.TestError, "VM seems to be dead; Test requires a 

living VM"

Quoted 2 lines
Quoted 2 lines

I agree with you on this point, I remember that somebody to do this before. but seems upstream not accept his modification.

Ok, will take a look at this. By the way, when you have an updated patch please let us know!

Thank you very much,

Signature · 3 lines
Lucas Meneghel Rodrigues
Software Engineer (QE)
Red Hat - Emerging Technologies
author
#8 lore raw

Good morning you all. :)

Lucas:
Very appreciated your help on try...except block implementation. I am finally understand your means when I read the mail. :(

I modified the timedrift case in several place again.
1. add more comments in script.
2. functional the snippnet of script which get clock resource from guest and host.
3. using vm.get_command_status replace the sendline API when complie the stress program in guest area.

If there is something need to be done by me for the script. feel free just kick me.

Happy weekend.

genload/Makefile +14 -0
diff -urN kvm_runtest_2.bak/genload/Makefile kvm_runtest_2/genload/Makefile
@@ -0,0 +1,14 @@
+CFLAGS+= -DPACKAGE=\"stress\" -DVERSION=\"0.17pre11\" 
+
+LDLIBS+= -lm
+
+SRCS=$(wildcard *.c)
+TARGETS=$(patsubst %.c,%,$(SRCS))
+
+all: $(TARGETS)
+
+install:
+	@ln -f $(TARGETS) ../../testcases/bin/genload
+
+clean:
+	rm -fr $(TARGETS)
genload/README +72 -0

72 lines not on this page · raw message

genload/stress.c +983 -0

983 lines not on this page · raw message

kvm_runtest_2.py +2 -0
diff -urN kvm_runtest_2.bak/kvm_runtest_2.py kvm_runtest_2/kvm_runtest_2.py
@@ -36,6 +36,8 @@
                 "autotest":     test_routine("kvm_tests",           "run_autotest"),
                 "kvm_install":  test_routine("kvm_install",         "run_kvm_install"),
                 "linux_s3":     test_routine("kvm_tests",           "run_linux_s3"),
+                "ntp_server_setup": test_routine("kvm_tests",       "run_ntp_server_setup"),
+                "timedrift":    test_routine("kvm_tests",           "run_timedrift"),
                 }
 
         # Make it possible to import modules from the test's bindir
kvm_tests.cfg.sample +5 -0
diff -urN kvm_runtest_2.bak/kvm_tests.cfg.sample kvm_runtest_2/kvm_tests.cfg.sample
@@ -81,6 +81,11 @@
     - linux_s3:      install setup
         type = linux_s3
 
+    - ntp_server_setup:
+        type = ntp_server_setup
+    - timedrift:      ntp_server_setup
+        type = timedrift
+        stress_test_specify = './stress -c 10 --timeout 240m'
 # NICs
 variants:
     - @rtl8139:
kvm_tests.py +276 -0

279 lines not on this page · raw message

#9 lore raw
Quoted 5 lines · bear

Good morning you all. :)

Lucas:
Very appreciated your help on try...except block implementation. I am finally understand your means when I read the mail. :(

Quoted 8 lines

I modified the timedrift case in several place again.
1. add more comments in script.
2. functional the snippnet of script which get clock resource from guest and host.
3. using vm.get_command_status replace the sendline API when complie the stress program in guest area.

If there is something need to be done by me for the script. feel free just kick me.

Happy weekend.

Hi Bear,

Please drop the NTP stuff. There's no need for it. Llet me again suggest my algorithm (pseudo-code, of course):

MeasureHostParams() // don't forget to measure the host's CPU, memory, I/O and network data - always useful. while (!enough)
{
RunAnotherVM() // don't forget to call SleepTillVmIsFullyRunning()
ForEachVM // this runs in parallel on the VMs
{
before = TimeOnHost()
RunXMinutesLoadOnGuest(load, minutes) // load can vary -
synthetic CPU, I/O or 'real life' load. Can also vary from VM to VM.
after = TimeOnHost()
drift = after - before
If(drift >= TooMuch) // How much is too much? Could be in
percentage or absolute values.
enough = true
}
}

Simple algorithm, works for us, does not require NTP, and loads the host in the most natural way it will be loaded in real life - by more VMs.
Slight variations are possible. For example, use the first VM as a 'canary' VM - and measure only on it - the others can do random load; pin down VM to CPUs; vary the load, the VMs used, and the time, etc.

HTH,
Y.

author
#10 lore raw

Hello Yaniv Kaul:
I am understand your means for timedrift testcase.
* give up using ntp to query and sync the clock from guest to host. my question is below:
1. why we can not using the NTP staff in timedrift test case? Is there some positive bugs were point on NTP or we found that something of NTP definite blocked us to using it? Or could you give me what exact we need give up NTP in timedrift test case?

2. for your algorithm:
MeasureHostParams() // don't forget to measure the host's CPU, memory, I/O and network data - always useful.
while (!enough)
{
RunAnotherVM() // don't forget to call SleepTillVmIsFullyRunning()
ForEachVM // this runs in parallel on the VMs
{
before = TimeOnHost()
RunXMinutesLoadOnGuest(load, minutes) // load can vary -
synthetic CPU, I/O or 'real life' load. Can also vary from VM to VM.
after = TimeOnHost()
drift = after - before
If(drift >= TooMuch) // How much is too much? Could be in
percentage or absolute values.
enough = true
}
}
Why get time from host(TimeOnHost()), why?I think it should be TimeOnGuest(). Could you kindly tell me the details about how to get the value of before/after and drift?

3. you suggest that the loaded is runing on host is prefer than running on guest and running several guest on host to make load on host. right? why? nowadays, I using the stress program which provided by Lucas just running in guest.

4. I also want to know the result that the script works on your side.Maybe it is more easy to help me understand your algorithm than read the script.

thanks for your explanation

Quoted 45 lines · Yaniv Kaul
Quoted 5 lines · bear

Good morning you all. :)

Lucas:
Very appreciated your help on try...except block implementation. I am finally understand your means when I read the mail. :(

Quoted 8 lines

I modified the timedrift case in several place again.
1. add more comments in script.
2. functional the snippnet of script which get clock resource from guest and host.
3. using vm.get_command_status replace the sendline API when complie the stress program in guest area.

If there is something need to be done by me for the script. feel free just kick me.

Happy weekend.

Hi Bear,

Please drop the NTP stuff. There's no need for it. Llet me again suggest my algorithm (pseudo-code, of course):

MeasureHostParams() // don't forget to measure the host's CPU, memory, I/O and network data - always useful. while (!enough)
{
RunAnotherVM() // don't forget to call SleepTillVmIsFullyRunning()
ForEachVM // this runs in parallel on the VMs
{
before = TimeOnHost()
RunXMinutesLoadOnGuest(load, minutes) // load can vary -
synthetic CPU, I/O or 'real life' load. Can also vary from VM to VM.
after = TimeOnHost()
drift = after - before
If(drift >= TooMuch) // How much is too much? Could be in
percentage or absolute values.
enough = true
}
}

Simple algorithm, works for us, does not require NTP, and loads the host in the most natural way it will be loaded in real life - by more VMs.
Slight variations are possible. For example, use the first VM as a 'canary' VM - and measure only on it - the others can do random load; pin down VM to CPUs; vary the load, the VMs used, and the time, etc.

HTH,
Y.

Signature · 3 lines
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
#11 lore raw
Quoted 4 lines · Bear Yang

Hello Yaniv Kaul:
I am understand your means for timedrift testcase.
* give up using ntp to query and sync the clock from guest to host. my question is below:
1. why we can not using the NTP staff in timedrift test case? Is there some positive bugs were point on NTP or we found that something of NTP definite blocked us to using it? Or could you give me what exact we need give up NTP in timedrift test case?

Just another requirement from the host we do not really need. And a bit more hassle to configure on Windows. And who knows how to configure on operating system this-or-that.

Quoted 11 lines

2. for your algorithm:
MeasureHostParams() // don't forget to measure the host's CPU, memory, I/O and network data - always useful. while (!enough)
{
RunAnotherVM() // don't forget to call SleepTillVmIsFullyRunning()
ForEachVM // this runs in parallel on the VMs
{
before = TimeOnHost()
RunXMinutesLoadOnGuest(load, minutes) // load can vary -
synthetic CPU, I/O or 'real life' load. Can also vary from VM to VM.

Quoted 8 lines

after = TimeOnHost()
drift = after - before
If(drift >= TooMuch) // How much is too much? Could be in
percentage or absolute values.
enough = true
}
}
Why get time from host(TimeOnHost()), why?I think it should be TimeOnGuest(). Could you kindly tell me the details about how to get the value of before/after and drift?

I don't need to get the time on the guest. I know I've asked it to run a load for X minutes. The guest has run that for what it think is X minutes - but may be X+drift minutes - because its clock drifted. If I want to know by how much, I need to compare to a reliable source - the host (or in our case, the test server actually).

Quoted 2 lines

3. you suggest that the loaded is runing on host is prefer than running on guest and running several guest on host to make load on host. right? why? nowadays, I using the stress program which provided by Lucas just running in guest.

Good, load the guest. But if the host can satisfy the guest's requirements, it won't be drifting (I hope!). We need to overload a bit here. The most natural way is with more VMs.

Quoted 2 lines

4. I also want to know the result that the script works on your side.Maybe it is more easy to help me understand your algorithm than read the script.

We'll need to run it. Haven't run it for a while actually.

Y.

Quoted 51 lines

thanks for your explanation

Quoted 45 lines · Yaniv Kaul
Quoted 5 lines · bear

Good morning you all. :)

Lucas:
Very appreciated your help on try...except block implementation. I am finally understand your means when I read the mail. :(

Quoted 8 lines

I modified the timedrift case in several place again.
1. add more comments in script.
2. functional the snippnet of script which get clock resource from guest and host.
3. using vm.get_command_status replace the sendline API when complie the stress program in guest area.

If there is something need to be done by me for the script. feel free just kick me.

Happy weekend.

Hi Bear,

Please drop the NTP stuff. There's no need for it. Llet me again suggest my algorithm (pseudo-code, of course):

MeasureHostParams() // don't forget to measure the host's CPU, memory, I/O and network data - always useful. while (!enough)
{
RunAnotherVM() // don't forget to call SleepTillVmIsFullyRunning()
ForEachVM // this runs in parallel on the VMs
{
before = TimeOnHost()
RunXMinutesLoadOnGuest(load, minutes) // load can vary -
synthetic CPU, I/O or 'real life' load. Can also vary from VM to VM.
after = TimeOnHost()
drift = after - before
If(drift >= TooMuch) // How much is too much? Could be in
percentage or absolute values.
enough = true
}
}

Simple algorithm, works for us, does not require NTP, and loads the host in the most natural way it will be loaded in real life - by more VMs.
Slight variations are possible. For example, use the first VM as a 'canary' VM - and measure only on it - the others can do random load; pin down VM to CPUs; vary the load, the VMs used, and the time, etc.

HTH,
Y.

Signature · 3 lines
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
author
#12 lore raw

Hello Yaniv Kaul:
my comments is below.

Quoted 6 lines · Yaniv Kaul
Quoted 4 lines · Bear Yang

Hello Yaniv Kaul:
I am understand your means for timedrift testcase.
* give up using ntp to query and sync the clock from guest to host. my question is below:
1. why we can not using the NTP staff in timedrift test case? Is there some positive bugs were point on NTP or we found that something of NTP definite blocked us to using it? Or could you give me what exact we need give up NTP in timedrift test case?

Just another requirement from the host we do not really need. And a bit more hassle to configure on Windows. And who knows how to configure on operating system this-or-that.

Actually, I still have not a clear realize about why not give up NTP in timedrift test case. just for could not run this mode on windows guest? Except this NTP have not problem internally to block us to use it? right?

I have working on TimeDrift problem base on KVM for several months, now you pointed out that we do not need NTP. you really need give me a reasonable reason or explanation for this at first. because If I give up NTP, that mean I need rewrite the TimeDrift case. the bug related my case will be abolished and my work on this will be abolished.

Quoted 19 lines
Quoted 11 lines

2. for your algorithm:
MeasureHostParams() // don't forget to measure the host's CPU, memory, I/O and network data - always useful. while (!enough)
{
RunAnotherVM() // don't forget to call SleepTillVmIsFullyRunning()
ForEachVM // this runs in parallel on the VMs
{
before = TimeOnHost()
RunXMinutesLoadOnGuest(load, minutes) // load can vary -
synthetic CPU, I/O or 'real life' load. Can also vary from VM to VM.

Quoted 8 lines

after = TimeOnHost()
drift = after - before
If(drift >= TooMuch) // How much is too much? Could be in
percentage or absolute values.
enough = true
}
}
Why get time from host(TimeOnHost()), why?I think it should be TimeOnGuest(). Could you kindly tell me the details about how to get the value of before/after and drift?

Quoted 1 line

I don't need to get the time on the guest. I know I've asked it to run a load for X minutes. The guest has run that for what it think is X minutes - but may be X+drift minutes - because its clock drifted. If I want to know by how much, I need to compare to a reliable source - the host (or in our case, the test server actually).

Yes, we need get the compare between host clock and guest clock whatever we useing NTP or not, please tell me how to get this comparison in your algorithm clearly. and show me how exactly you implement it for the value(before/after and drift)

We purpose is found out if *Guest* has time drift problem. KVM is full virtualizaiton technology, guest does not know it running as a guest. so Why we need add the loaded to Host?

BTW, my script now have the ability to configre option from control file to running stress testing just for X minutes or X hours?

Quoted 3 lines
Quoted 2 lines

3. you suggest that the loaded is runing on host is prefer than running on guest and running several guest on host to make load on host. right? why? nowadays, I using the stress program which provided by Lucas just running in guest.

Good, load the guest. But if the host can satisfy the guest's requirements, it won't be drifting (I hope!). We need to overload a bit here. The most natural way is with more VMs.

I don't catch your means for your sentence "load the guest. But if the host can satisfy the guest's requirements, it won't be drifting (I hope!)." Could you please explain it for me?

Quoted 58 lines
Quoted 3 lines

4. I also want to know the result that the script works on your side.Maybe it is more easy to help me understand your algorithm than read the script.

We'll need to run it. Haven't run it for a while actually.

Y.

Quoted 51 lines

thanks for your explanation

Quoted 45 lines · Yaniv Kaul
Quoted 5 lines · bear

Good morning you all. :)

Lucas:
Very appreciated your help on try...except block implementation. I am finally understand your means when I read the mail. :(

Quoted 8 lines

I modified the timedrift case in several place again.
1. add more comments in script.
2. functional the snippnet of script which get clock resource from guest and host.
3. using vm.get_command_status replace the sendline API when complie the stress program in guest area.

If there is something need to be done by me for the script. feel free just kick me.

Happy weekend.

Hi Bear,

Please drop the NTP stuff. There's no need for it. Llet me again suggest my algorithm (pseudo-code, of course):

MeasureHostParams() // don't forget to measure the host's CPU, memory, I/O and network data - always useful. while (!enough)
{
RunAnotherVM() // don't forget to call SleepTillVmIsFullyRunning()
ForEachVM // this runs in parallel on the VMs
{
before = TimeOnHost()
RunXMinutesLoadOnGuest(load, minutes) // load can vary -
synthetic CPU, I/O or 'real life' load. Can also vary from VM to VM.
after = TimeOnHost()
drift = after - before
If(drift >= TooMuch) // How much is too much? Could be in
percentage or absolute values.
enough = true
}
}

Simple algorithm, works for us, does not require NTP, and loads the host in the most natural way it will be loaded in real life - by more VMs.
Slight variations are possible. For example, use the first VM as a 'canary' VM - and measure only on it - the others can do random load; pin down VM to CPUs; vary the load, the VMs used, and the time, etc.

HTH,
Y.

Signature · 3 lines
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html