* Re: hith latency when cpu is fully loaded
[not found] <25135.7772549213$1574125359@news.gmane.org>
@ 2019-11-19 6:49 ` Jan Kiszka
2019-11-19 7:45 ` chensong
0 siblings, 1 reply; 5+ messages in thread
From: Jan Kiszka @ 2019-11-19 6:49 UTC (permalink / raw)
To: chensong, xenomai
On 19.11.19 02:01, chensong via Xenomai wrote:
> Dear experts,
>
> i'm new in xenomai, i got an issue, here is the detail:
>
> Main processor architect: ARM64 phytium ft2000ahk
> Kernel release number: 4.14.4
> cmdline:BOOT_IMAGE=/Image-tmp
> root=UUID=9fea0634-a9c9-4e9f-906c-9c36b7249822 console=ttyS1,115200
> earlyprintk=uart8250-32bit,0x28001000 rw rootdelay=10 KEYBOARDTYPE=pc
> KEYTABLE=us security=
> xenomai release number:3.1-devel
> xenomai configuration:
> kylin@kylin-os:~/workspace/code/nudt-hgj-xenomai-tjrd$ grep
> configure config.status
> # Generated by configure.
> # Compiler output produced by configure, useful for debugging
> # configure, is in config.log if it exists.
> configured by ./configure, generated by GNU Autoconf 2.69,
> ac_configure_extra_args=
> ac_configure_extra_args="$ac_configure_extra_args --silent"
> set X /bin/bash './configure' '--with-core=cobalt'
> '--enable-smp' '--enable-pshared' $ac_configure_extra_args --no-create
> --no-recursion
> configure_time_dlsearch_path='/lib /usr/lib
> /lib/aarch64-linux-gnu /usr/lib/aarch64-linux-gnu
> /usr/lib/aarch64-linux-gnu/mesa-egl /usr/lib/aarch64-linux-gnu/mesa
> /usr/local/lib '
> configure_time_lt_sys_library_path=''
> for var in reload_cmds old_postinstall_cmds old_postuninstall_cmds
> old_archive_cmds extract_expsyms_cmds old_archive_from_new_cmds
> old_archive_from_expsyms_cmds archive_cmds archive_expsym_cmds
> module_cmds module_expsym_cmds export_symbols_cmds prelink_cmds
> postlink_cmds postinstall_cmds postuninstall_cmds finish_cmds
> sys_lib_search_path_spec configure_time_dlsearch_path
> configure_time_lt_sys_library_path; do
> # on some systems where configure will not decide to define it.
> # Let's still pretend it is `configure' which instantiates (i.e.,
> don't
> configure_input='Generated from '`
> `' by configure.'
> configure_input="$ac_file. $configure_input"
> case $configure_input in #(
> ac_sed_conf_input=`$as_echo "$configure_input" |
> *) ac_sed_conf_input=$configure_input;;
> s|@configure_input@|$ac_sed_conf_input|;t t
> $as_echo "/* $configure_input */" \
> $as_echo "/* $configure_input */" \
> # Libtool was configured on host `(hostname || uname -n)
> 2>/dev/null | sed 1q`:
> : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
> sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
> # Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
> configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
>
> OR:
> kylin@kylin-os:~$ xeno-config --info
> Xenomai version: Xenomai/cobalt v3.1-devel -- # ()
> Linux kylin-os 4.14.4.kylin.rt-1118-ipipe-trace+ #2 SMP PREEMPT
> Mon Nov 18 18:28:17 CST 2019 aarch64 aarch64 aarch64 GNU/Linux
> Kernel parameters: BOOT_IMAGE=/Image-tmp
> root=UUID=9fea0634-a9c9-4e9f-906c-9c36b7249822 console=ttyS1,115200
> earlyprintk=uart8250-32bit,0x28001000 rw rootdelay=10 KEYBOARDTYPE=pc
> KEYTABLE=us security=
> I-pipe release #2 detected
> Cobalt core 3.1-devel detected
> Compiler: gcc version 5.4.0 20160609 (Ubuntu/Linaro
> 5.4.0-6kord1~16.04.10)
> Build args: --prefix=/usr --includedir=/usr/include/xenomai
> --mandir=/usr/share/man --with-testdir=/usr/lib/xenomai/testsuite
> --enable-smp --build aarch64-linux-gnu build_alias=aarch64-linux-gnu
>
> Desktop: kylin 4.0.2 (ubuntu likely desktop)
>
> Issue description:
> latency and cyclictest work fine in my system in most of cases,
> the worst latency is around 100us ~ 200us. however, when i ran a script
> to increase the cpu load in the system, the worst latency reached 2000us
> ~ 5000us or even worse. Basically, the script forks 6 processes by
> default and each process applies a four-pages buffer and keeps writing
> without any breath, no warning or error messages in dmesg. below is the
> script:
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <sys/types.h>
> #include <sys/wait.h>
> #include <sys/stat.h>
> #include <fcntl.h>
>
> #define PAGE_SIZE 4096
> #define TEST_THREADS 6
>
> unsigned int test_threads;
>
> void do_thread_test(void)
> {
> void *mm;
> char i = 0;
>
> printf("mem test thread start \n");
> mm = malloc(PAGE_SIZE * 4); // 1M
> while(1) {
> for (i = 0; i<100; i++)
> memset(mm, i, PAGE_SIZE * 4);
> }
You cannot run Xenomai threads at 100% on Linux. You need to leave some
time for the rest of the system to do housekeeping. That explains the
"deadlock" you see. If you turn on CONFIG_XENO_OPT_WATCHDOG, it will
detect such mistakes and kick the task out of RT.
Jan
--
Siemens AG, Corporate Technology, CT RDA IOT SES-DE
Corporate Competence Center Embedded Linux
^ permalink raw reply [flat|nested] 5+ messages in thread* Re: hith latency when cpu is fully loaded
2019-11-19 6:49 ` hith latency when cpu is fully loaded Jan Kiszka
@ 2019-11-19 7:45 ` chensong
2019-11-19 8:03 ` Jan Kiszka
0 siblings, 1 reply; 5+ messages in thread
From: chensong @ 2019-11-19 7:45 UTC (permalink / raw)
To: Jan Kiszka, xenomai
On 2019年11月19日 14:49, Jan Kiszka wrote:
> On 19.11.19 02:01, chensong via Xenomai wrote:
>> Dear experts,
>>
>> i'm new in xenomai, i got an issue, here is the detail:
>>
>> Main processor architect: ARM64 phytium ft2000ahk
>> Kernel release number: 4.14.4
>> cmdline:BOOT_IMAGE=/Image-tmp
>> root=UUID=9fea0634-a9c9-4e9f-906c-9c36b7249822 console=ttyS1,115200
>> earlyprintk=uart8250-32bit,0x28001000 rw rootdelay=10 KEYBOARDTYPE=pc
>> KEYTABLE=us security=
>> xenomai release number:3.1-devel
>> xenomai configuration:
>> kylin@kylin-os:~/workspace/code/nudt-hgj-xenomai-tjrd$ grep
>> configure config.status
>> # Generated by configure.
>> # Compiler output produced by configure, useful for debugging
>> # configure, is in config.log if it exists.
>> configured by ./configure, generated by GNU Autoconf 2.69,
>> ac_configure_extra_args=
>> ac_configure_extra_args="$ac_configure_extra_args --silent"
>> set X /bin/bash './configure' '--with-core=cobalt'
>> '--enable-smp' '--enable-pshared' $ac_configure_extra_args --no-create
>> --no-recursion
>> configure_time_dlsearch_path='/lib /usr/lib
>> /lib/aarch64-linux-gnu /usr/lib/aarch64-linux-gnu
>> /usr/lib/aarch64-linux-gnu/mesa-egl /usr/lib/aarch64-linux-gnu/mesa
>> /usr/local/lib '
>> configure_time_lt_sys_library_path=''
>> for var in reload_cmds old_postinstall_cmds
>> old_postuninstall_cmds old_archive_cmds extract_expsyms_cmds
>> old_archive_from_new_cmds old_archive_from_expsyms_cmds archive_cmds
>> archive_expsym_cmds module_cmds module_expsym_cmds export_symbols_cmds
>> prelink_cmds postlink_cmds postinstall_cmds postuninstall_cmds
>> finish_cmds sys_lib_search_path_spec configure_time_dlsearch_path
>> configure_time_lt_sys_library_path; do
>> # on some systems where configure will not decide to define it.
>> # Let's still pretend it is `configure' which instantiates
>> (i.e., don't
>> configure_input='Generated from '`
>> `' by configure.'
>> configure_input="$ac_file. $configure_input"
>> case $configure_input in #(
>> ac_sed_conf_input=`$as_echo "$configure_input" |
>> *) ac_sed_conf_input=$configure_input;;
>> s|@configure_input@|$ac_sed_conf_input|;t t
>> $as_echo "/* $configure_input */" \
>> $as_echo "/* $configure_input */" \
>> # Libtool was configured on host `(hostname || uname -n)
>> 2>/dev/null | sed 1q`:
>> : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
>> sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
>> # Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
>> configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
>>
>> OR:
>> kylin@kylin-os:~$ xeno-config --info
>> Xenomai version: Xenomai/cobalt v3.1-devel -- # ()
>> Linux kylin-os 4.14.4.kylin.rt-1118-ipipe-trace+ #2 SMP
>> PREEMPT Mon Nov 18 18:28:17 CST 2019 aarch64 aarch64 aarch64 GNU/Linux
>> Kernel parameters: BOOT_IMAGE=/Image-tmp
>> root=UUID=9fea0634-a9c9-4e9f-906c-9c36b7249822 console=ttyS1,115200
>> earlyprintk=uart8250-32bit,0x28001000 rw rootdelay=10 KEYBOARDTYPE=pc
>> KEYTABLE=us security=
>> I-pipe release #2 detected
>> Cobalt core 3.1-devel detected
>> Compiler: gcc version 5.4.0 20160609 (Ubuntu/Linaro
>> 5.4.0-6kord1~16.04.10)
>> Build args: --prefix=/usr --includedir=/usr/include/xenomai
>> --mandir=/usr/share/man --with-testdir=/usr/lib/xenomai/testsuite
>> --enable-smp --build aarch64-linux-gnu build_alias=aarch64-linux-gnu
>>
>> Desktop: kylin 4.0.2 (ubuntu likely desktop)
>>
>> Issue description:
>> latency and cyclictest work fine in my system in most of cases,
>> the worst latency is around 100us ~ 200us. however, when i ran a
>> script to increase the cpu load in the system, the worst latency
>> reached 2000us ~ 5000us or even worse. Basically, the script forks 6
>> processes by default and each process applies a four-pages buffer and
>> keeps writing without any breath, no warning or error messages in
>> dmesg. below is the script:
>>
>> #include <stdio.h>
>> #include <stdlib.h>
>> #include <sys/types.h>
>> #include <sys/wait.h>
>> #include <sys/stat.h>
>> #include <fcntl.h>
>>
>> #define PAGE_SIZE 4096
>> #define TEST_THREADS 6
>>
>> unsigned int test_threads;
>>
>> void do_thread_test(void)
>> {
>> void *mm;
>> char i = 0;
>>
>> printf("mem test thread start \n");
>> mm = malloc(PAGE_SIZE * 4); // 1M
>> while(1) {
>> for (i = 0; i<100; i++)
>> memset(mm, i, PAGE_SIZE * 4);
>> }
>
> You cannot run Xenomai threads at 100% on Linux. You need to leave some
> time for the rest of the system to do housekeeping. That explains the
> "deadlock" you see. If you turn on CONFIG_XENO_OPT_WATCHDOG, it will
> detect such mistakes and kick the task out of RT.
>
> Jan
>
"do_thread_test" is not an RT task, it's running in linux domain and
latency running in xenomai domain was affected.
/Song
^ permalink raw reply [flat|nested] 5+ messages in thread* Re: hith latency when cpu is fully loaded
2019-11-19 7:45 ` chensong
@ 2019-11-19 8:03 ` Jan Kiszka
2019-11-19 8:23 ` chensong
0 siblings, 1 reply; 5+ messages in thread
From: Jan Kiszka @ 2019-11-19 8:03 UTC (permalink / raw)
To: chensong, xenomai
On 19.11.19 08:45, chensong wrote:
>
>
> On 2019年11月19日 14:49, Jan Kiszka wrote:
>> On 19.11.19 02:01, chensong via Xenomai wrote:
>>> Dear experts,
>>>
>>> i'm new in xenomai, i got an issue, here is the detail:
>>>
>>> Main processor architect: ARM64 phytium ft2000ahk
>>> Kernel release number: 4.14.4
>>> cmdline:BOOT_IMAGE=/Image-tmp
>>> root=UUID=9fea0634-a9c9-4e9f-906c-9c36b7249822 console=ttyS1,115200
>>> earlyprintk=uart8250-32bit,0x28001000 rw rootdelay=10 KEYBOARDTYPE=pc
>>> KEYTABLE=us security=
>>> xenomai release number:3.1-devel
>>> xenomai configuration:
>>> kylin@kylin-os:~/workspace/code/nudt-hgj-xenomai-tjrd$ grep
>>> configure config.status
>>> # Generated by configure.
>>> # Compiler output produced by configure, useful for debugging
>>> # configure, is in config.log if it exists.
>>> configured by ./configure, generated by GNU Autoconf 2.69,
>>> ac_configure_extra_args=
>>> ac_configure_extra_args="$ac_configure_extra_args --silent"
>>> set X /bin/bash './configure' '--with-core=cobalt'
>>> '--enable-smp' '--enable-pshared' $ac_configure_extra_args --no-create
>>> --no-recursion
>>> configure_time_dlsearch_path='/lib /usr/lib
>>> /lib/aarch64-linux-gnu /usr/lib/aarch64-linux-gnu
>>> /usr/lib/aarch64-linux-gnu/mesa-egl /usr/lib/aarch64-linux-gnu/mesa
>>> /usr/local/lib '
>>> configure_time_lt_sys_library_path=''
>>> for var in reload_cmds old_postinstall_cmds
>>> old_postuninstall_cmds old_archive_cmds extract_expsyms_cmds
>>> old_archive_from_new_cmds old_archive_from_expsyms_cmds archive_cmds
>>> archive_expsym_cmds module_cmds module_expsym_cmds export_symbols_cmds
>>> prelink_cmds postlink_cmds postinstall_cmds postuninstall_cmds
>>> finish_cmds sys_lib_search_path_spec configure_time_dlsearch_path
>>> configure_time_lt_sys_library_path; do
>>> # on some systems where configure will not decide to define it.
>>> # Let's still pretend it is `configure' which instantiates
>>> (i.e., don't
>>> configure_input='Generated from '`
>>> `' by configure.'
>>> configure_input="$ac_file. $configure_input"
>>> case $configure_input in #(
>>> ac_sed_conf_input=`$as_echo "$configure_input" |
>>> *) ac_sed_conf_input=$configure_input;;
>>> s|@configure_input@|$ac_sed_conf_input|;t t
>>> $as_echo "/* $configure_input */" \
>>> $as_echo "/* $configure_input */" \
>>> # Libtool was configured on host `(hostname || uname -n)
>>> 2>/dev/null | sed 1q`:
>>> : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
>>> sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
>>> # Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
>>> configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
>>>
>>>
>>> OR:
>>> kylin@kylin-os:~$ xeno-config --info
>>> Xenomai version: Xenomai/cobalt v3.1-devel -- # ()
>>> Linux kylin-os 4.14.4.kylin.rt-1118-ipipe-trace+ #2 SMP
>>> PREEMPT Mon Nov 18 18:28:17 CST 2019 aarch64 aarch64 aarch64 GNU/Linux
>>> Kernel parameters: BOOT_IMAGE=/Image-tmp
>>> root=UUID=9fea0634-a9c9-4e9f-906c-9c36b7249822 console=ttyS1,115200
>>> earlyprintk=uart8250-32bit,0x28001000 rw rootdelay=10 KEYBOARDTYPE=pc
>>> KEYTABLE=us security=
>>> I-pipe release #2 detected
>>> Cobalt core 3.1-devel detected
>>> Compiler: gcc version 5.4.0 20160609 (Ubuntu/Linaro
>>> 5.4.0-6kord1~16.04.10)
>>> Build args: --prefix=/usr --includedir=/usr/include/xenomai
>>> --mandir=/usr/share/man --with-testdir=/usr/lib/xenomai/testsuite
>>> --enable-smp --build aarch64-linux-gnu build_alias=aarch64-linux-gnu
>>>
>>> Desktop: kylin 4.0.2 (ubuntu likely desktop)
>>>
>>> Issue description:
>>> latency and cyclictest work fine in my system in most of cases,
>>> the worst latency is around 100us ~ 200us. however, when i ran a
>>> script to increase the cpu load in the system, the worst latency
>>> reached 2000us ~ 5000us or even worse. Basically, the script forks 6
>>> processes by default and each process applies a four-pages buffer and
>>> keeps writing without any breath, no warning or error messages in
>>> dmesg. below is the script:
>>>
>>> #include <stdio.h>
>>> #include <stdlib.h>
>>> #include <sys/types.h>
>>> #include <sys/wait.h>
>>> #include <sys/stat.h>
>>> #include <fcntl.h>
>>>
>>> #define PAGE_SIZE 4096
>>> #define TEST_THREADS 6
>>>
>>> unsigned int test_threads;
>>>
>>> void do_thread_test(void)
>>> {
>>> void *mm;
>>> char i = 0;
>>>
>>> printf("mem test thread start \n");
>>> mm = malloc(PAGE_SIZE * 4); // 1M
>>> while(1) {
>>> for (i = 0; i<100; i++)
>>> memset(mm, i, PAGE_SIZE * 4);
>>> }
>>
>> You cannot run Xenomai threads at 100% on Linux. You need to leave some
>> time for the rest of the system to do housekeeping. That explains the
>> "deadlock" you see. If you turn on CONFIG_XENO_OPT_WATCHDOG, it will
>> detect such mistakes and kick the task out of RT.
>>
>> Jan
>>
>
> "do_thread_test" is not an RT task, it's running in linux domain and
> latency running in xenomai domain was affected.
Ok, I missed that.
Are you using an official I-pipe release kernel (doesn't look like)?
Please try 4.19.y for that. If it's a downstream kernel (from I-pipe
perspective), your local BSP enablings may not be correct yet, breaking
RT subtly.
Power or also thermal management are further areas of disturbance. They
may either unneeded degrade performance and, thus, latencies or need to
throttle overloaded/overheated CPUs.
Jan
--
Siemens AG, Corporate Technology, CT RDA IOT SES-DE
Corporate Competence Center Embedded Linux
^ permalink raw reply [flat|nested] 5+ messages in thread* Re: hith latency when cpu is fully loaded
2019-11-19 8:03 ` Jan Kiszka
@ 2019-11-19 8:23 ` chensong
0 siblings, 0 replies; 5+ messages in thread
From: chensong @ 2019-11-19 8:23 UTC (permalink / raw)
To: Jan Kiszka, xenomai
On 2019年11月19日 16:03, Jan Kiszka wrote:
> On 19.11.19 08:45, chensong wrote:
>>
>>
>> On 2019年11月19日 14:49, Jan Kiszka wrote:
>>> On 19.11.19 02:01, chensong via Xenomai wrote:
>>>> Dear experts,
>>>>
>>>> i'm new in xenomai, i got an issue, here is the detail:
>>>>
>>>> Main processor architect: ARM64 phytium ft2000ahk
>>>> Kernel release number: 4.14.4
>>>> cmdline:BOOT_IMAGE=/Image-tmp
>>>> root=UUID=9fea0634-a9c9-4e9f-906c-9c36b7249822 console=ttyS1,115200
>>>> earlyprintk=uart8250-32bit,0x28001000 rw rootdelay=10 KEYBOARDTYPE=pc
>>>> KEYTABLE=us security=
>>>> xenomai release number:3.1-devel
>>>> xenomai configuration:
>>>> kylin@kylin-os:~/workspace/code/nudt-hgj-xenomai-tjrd$ grep
>>>> configure config.status
>>>> # Generated by configure.
>>>> # Compiler output produced by configure, useful for debugging
>>>> # configure, is in config.log if it exists.
>>>> configured by ./configure, generated by GNU Autoconf 2.69,
>>>> ac_configure_extra_args=
>>>> ac_configure_extra_args="$ac_configure_extra_args --silent"
>>>> set X /bin/bash './configure' '--with-core=cobalt'
>>>> '--enable-smp' '--enable-pshared' $ac_configure_extra_args --no-create
>>>> --no-recursion
>>>> configure_time_dlsearch_path='/lib /usr/lib
>>>> /lib/aarch64-linux-gnu /usr/lib/aarch64-linux-gnu
>>>> /usr/lib/aarch64-linux-gnu/mesa-egl /usr/lib/aarch64-linux-gnu/mesa
>>>> /usr/local/lib '
>>>> configure_time_lt_sys_library_path=''
>>>> for var in reload_cmds old_postinstall_cmds
>>>> old_postuninstall_cmds old_archive_cmds extract_expsyms_cmds
>>>> old_archive_from_new_cmds old_archive_from_expsyms_cmds archive_cmds
>>>> archive_expsym_cmds module_cmds module_expsym_cmds export_symbols_cmds
>>>> prelink_cmds postlink_cmds postinstall_cmds postuninstall_cmds
>>>> finish_cmds sys_lib_search_path_spec configure_time_dlsearch_path
>>>> configure_time_lt_sys_library_path; do
>>>> # on some systems where configure will not decide to define it.
>>>> # Let's still pretend it is `configure' which instantiates
>>>> (i.e., don't
>>>> configure_input='Generated from '`
>>>> `' by configure.'
>>>> configure_input="$ac_file. $configure_input"
>>>> case $configure_input in #(
>>>> ac_sed_conf_input=`$as_echo "$configure_input" |
>>>> *) ac_sed_conf_input=$configure_input;;
>>>> s|@configure_input@|$ac_sed_conf_input|;t t
>>>> $as_echo "/* $configure_input */" \
>>>> $as_echo "/* $configure_input */" \
>>>> # Libtool was configured on host `(hostname || uname -n)
>>>> 2>/dev/null | sed 1q`:
>>>> : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
>>>> sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
>>>> # Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
>>>> configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
>>>>
>>>>
>>>> OR:
>>>> kylin@kylin-os:~$ xeno-config --info
>>>> Xenomai version: Xenomai/cobalt v3.1-devel -- # ()
>>>> Linux kylin-os 4.14.4.kylin.rt-1118-ipipe-trace+ #2 SMP
>>>> PREEMPT Mon Nov 18 18:28:17 CST 2019 aarch64 aarch64 aarch64 GNU/Linux
>>>> Kernel parameters: BOOT_IMAGE=/Image-tmp
>>>> root=UUID=9fea0634-a9c9-4e9f-906c-9c36b7249822 console=ttyS1,115200
>>>> earlyprintk=uart8250-32bit,0x28001000 rw rootdelay=10 KEYBOARDTYPE=pc
>>>> KEYTABLE=us security=
>>>> I-pipe release #2 detected
>>>> Cobalt core 3.1-devel detected
>>>> Compiler: gcc version 5.4.0 20160609 (Ubuntu/Linaro
>>>> 5.4.0-6kord1~16.04.10)
>>>> Build args: --prefix=/usr --includedir=/usr/include/xenomai
>>>> --mandir=/usr/share/man --with-testdir=/usr/lib/xenomai/testsuite
>>>> --enable-smp --build aarch64-linux-gnu build_alias=aarch64-linux-gnu
>>>>
>>>> Desktop: kylin 4.0.2 (ubuntu likely desktop)
>>>>
>>>> Issue description:
>>>> latency and cyclictest work fine in my system in most of cases,
>>>> the worst latency is around 100us ~ 200us. however, when i ran a
>>>> script to increase the cpu load in the system, the worst latency
>>>> reached 2000us ~ 5000us or even worse. Basically, the script forks 6
>>>> processes by default and each process applies a four-pages buffer and
>>>> keeps writing without any breath, no warning or error messages in
>>>> dmesg. below is the script:
>>>>
>>>> #include <stdio.h>
>>>> #include <stdlib.h>
>>>> #include <sys/types.h>
>>>> #include <sys/wait.h>
>>>> #include <sys/stat.h>
>>>> #include <fcntl.h>
>>>>
>>>> #define PAGE_SIZE 4096
>>>> #define TEST_THREADS 6
>>>>
>>>> unsigned int test_threads;
>>>>
>>>> void do_thread_test(void)
>>>> {
>>>> void *mm;
>>>> char i = 0;
>>>>
>>>> printf("mem test thread start \n");
>>>> mm = malloc(PAGE_SIZE * 4); // 1M
>>>> while(1) {
>>>> for (i = 0; i<100; i++)
>>>> memset(mm, i, PAGE_SIZE * 4);
>>>> }
>>>
>>> You cannot run Xenomai threads at 100% on Linux. You need to leave some
>>> time for the rest of the system to do housekeeping. That explains the
>>> "deadlock" you see. If you turn on CONFIG_XENO_OPT_WATCHDOG, it will
>>> detect such mistakes and kick the task out of RT.
>>>
>>> Jan
>>>
>>
>> "do_thread_test" is not an RT task, it's running in linux domain and
>> latency running in xenomai domain was affected.
>
> Ok, I missed that.
>
> Are you using an official I-pipe release kernel (doesn't look like)?
> Please try 4.19.y for that. If it's a downstream kernel (from I-pipe
> perspective), your local BSP enablings may not be correct yet, breaking
> RT subtly.
>
> Power or also thermal management are further areas of disturbance. They
> may either unneeded degrade performance and, thus, latencies or need to
> throttle overloaded/overheated CPUs.
>
> Jan
>
good idea, i will try an official I-pipe release kernel to see if it can
be reproduced and get you back soon, many thanks.
/song
^ permalink raw reply [flat|nested] 5+ messages in thread
* hith latency when cpu is fully loaded
@ 2019-11-19 1:01 chensong
0 siblings, 0 replies; 5+ messages in thread
From: chensong @ 2019-11-19 1:01 UTC (permalink / raw)
To: xenomai
Dear experts,
i'm new in xenomai, i got an issue, here is the detail:
Main processor architect: ARM64 phytium ft2000ahk
Kernel release number: 4.14.4
cmdline:BOOT_IMAGE=/Image-tmp
root=UUID=9fea0634-a9c9-4e9f-906c-9c36b7249822 console=ttyS1,115200
earlyprintk=uart8250-32bit,0x28001000 rw rootdelay=10 KEYBOARDTYPE=pc
KEYTABLE=us security=
xenomai release number:3.1-devel
xenomai configuration:
kylin@kylin-os:~/workspace/code/nudt-hgj-xenomai-tjrd$ grep
configure config.status
# Generated by configure.
# Compiler output produced by configure, useful for debugging
# configure, is in config.log if it exists.
configured by ./configure, generated by GNU Autoconf 2.69,
ac_configure_extra_args=
ac_configure_extra_args="$ac_configure_extra_args --silent"
set X /bin/bash './configure' '--with-core=cobalt'
'--enable-smp' '--enable-pshared' $ac_configure_extra_args --no-create
--no-recursion
configure_time_dlsearch_path='/lib /usr/lib
/lib/aarch64-linux-gnu /usr/lib/aarch64-linux-gnu
/usr/lib/aarch64-linux-gnu/mesa-egl /usr/lib/aarch64-linux-gnu/mesa
/usr/local/lib '
configure_time_lt_sys_library_path=''
for var in reload_cmds old_postinstall_cmds old_postuninstall_cmds
old_archive_cmds extract_expsyms_cmds old_archive_from_new_cmds
old_archive_from_expsyms_cmds archive_cmds archive_expsym_cmds
module_cmds module_expsym_cmds export_symbols_cmds prelink_cmds
postlink_cmds postinstall_cmds postuninstall_cmds finish_cmds
sys_lib_search_path_spec configure_time_dlsearch_path
configure_time_lt_sys_library_path; do
# on some systems where configure will not decide to define it.
# Let's still pretend it is `configure' which instantiates (i.e.,
don't
configure_input='Generated from '`
`' by configure.'
configure_input="$ac_file. $configure_input"
case $configure_input in #(
ac_sed_conf_input=`$as_echo "$configure_input" |
*) ac_sed_conf_input=$configure_input;;
s|@configure_input@|$ac_sed_conf_input|;t t
$as_echo "/* $configure_input */" \
$as_echo "/* $configure_input */" \
# Libtool was configured on host `(hostname || uname -n)
2>/dev/null | sed 1q`:
: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
# Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
OR:
kylin@kylin-os:~$ xeno-config --info
Xenomai version: Xenomai/cobalt v3.1-devel -- # ()
Linux kylin-os 4.14.4.kylin.rt-1118-ipipe-trace+ #2 SMP PREEMPT
Mon Nov 18 18:28:17 CST 2019 aarch64 aarch64 aarch64 GNU/Linux
Kernel parameters: BOOT_IMAGE=/Image-tmp
root=UUID=9fea0634-a9c9-4e9f-906c-9c36b7249822 console=ttyS1,115200
earlyprintk=uart8250-32bit,0x28001000 rw rootdelay=10 KEYBOARDTYPE=pc
KEYTABLE=us security=
I-pipe release #2 detected
Cobalt core 3.1-devel detected
Compiler: gcc version 5.4.0 20160609 (Ubuntu/Linaro
5.4.0-6kord1~16.04.10)
Build args: --prefix=/usr --includedir=/usr/include/xenomai
--mandir=/usr/share/man --with-testdir=/usr/lib/xenomai/testsuite
--enable-smp --build aarch64-linux-gnu build_alias=aarch64-linux-gnu
Desktop: kylin 4.0.2 (ubuntu likely desktop)
Issue description:
latency and cyclictest work fine in my system in most of cases,
the worst latency is around 100us ~ 200us. however, when i ran a script
to increase the cpu load in the system, the worst latency reached 2000us
~ 5000us or even worse. Basically, the script forks 6 processes by
default and each process applies a four-pages buffer and keeps writing
without any breath, no warning or error messages in dmesg. below is the
script:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>
#define PAGE_SIZE 4096
#define TEST_THREADS 6
unsigned int test_threads;
void do_thread_test(void)
{
void *mm;
char i = 0;
printf("mem test thread start \n");
mm = malloc(PAGE_SIZE * 4); // 1M
while(1) {
for (i = 0; i<100; i++)
memset(mm, i, PAGE_SIZE * 4);
}
}
void thread_test(void)
{
pid_t pid[TEST_THREADS];
int i = 0;
printf("begin start\n");
for (i = 0; i< test_threads; i++) {
pid[i] = fork();
if (pid[i] == 0)
do_thread_test();
}
}
int get_cpu_idle_info(int *idle, int *total)
{
FILE *fp;
int var[5][7];
char name[5][20];
char *line;
ssize_t read, len = 0;
int i = 0;
if ((fp = fopen("/proc/stat", "r")) == NULL) {
printf("open /proc/stat err !\n");
return -1;
}
while((read = getline(&line, &len, fp)) != -1) {
// fgets(buff, sizeof(buff), fp);
sscanf(line, "%s %u %u %u %u %u %u %u",
&name[i][0], &var[i][0], &var[i][1],
&var[i][2], &var[i][3],
&var[i][4], &var[i][5], &var[i][6]);
i++;
if (i >= 5)
break;
}
fclose(fp);
*idle = var[0][3];
*total = var[0][0] + var[0][1] + var[0][2] + var[0][3] +
var[0][4] + var[0][5] + var[0][6];
// printf("%d %d %d %d %d %d %d total %d\n", var[0][0], var[0][1],
var[0][2], var[0][3], var[0][4], var[0][5], var[0][6], *total);
return 0;
}
int get_cpu_freq(void)
{
FILE *fp;
char *line;
ssize_t read, len = 0;
int val = 0;
if ((fp =
fopen("/sys/devices/system/cpu/cpufreq/policy0/cpuinfo_cur_freq", "r"))
== NULL) {
printf("open /proc/stat err !\n");
return -1;
}
read = getline(&line, &len, fp);
sscanf(line, "%d", &val);
fclose(fp);
return val;
}
int cal_cpu_loadavg(void)
{
int cpu_info[2][2];
int load = 0;
if (get_cpu_idle_info(&cpu_info[0][0], &cpu_info[0][1]) != 0)
return -1;
sleep(1);
if(get_cpu_idle_info(&cpu_info[1][0], &cpu_info[1][1]) != 0)
return -1;
load = ((cpu_info[1][0] - cpu_info[0][0]) * 100) / (cpu_info[1][1]
- cpu_info[0][1]);
return load;
}
int main(int argc, char **argv)
{
pid_t pid;
int loadavg = 0;
if (argc == 2)
test_threads = atoi(argv[1]);
else
test_threads = TEST_THREADS;
pid = fork();
if (pid == 0) {
thread_test();
} else {
while (1) {
loadavg = cal_cpu_loadavg();
sleep(2);
if (loadavg == -1)
continue;
else
printf("load avg %d\n",100 - loadavg);
}
}
}
I enabled ipipe tracer and got the frozen like this:
I-pipe frozen back-tracing service on
4.14.4.kylin.rt-1118-ipipe-trace+/ipipe release #2
------------------------------------------------------------
CPU: 0, Freeze: 31865107520 cycles, Trace Points: 100 (+10)
Calibrated minimum trace-point overhead: 0.568 us
+----- Hard IRQs ('|': locked)
|+-- Xenomai
||+- Linux ('*': domain stalled, '+': current, '#': current+stalled)
||| +---------- Delay flag ('+': > 1 us, '!': > 10 us)
||| | +- NMI noise ('N')
||| | |
Type User Val. Time Delay Function (Parent)
:|# func -2556! 162.196 ___xnlock_put+0x14 (__put_fd+0x17c)
:|# func -2394 0.980 __ipipe_restore_head+0x20
(__put_fd+0x164)
:|+ end 0x80000000 -2393+ 1.137 __ipipe_restore_head+0x94
(<00000000>)
:|+ func -2391 1.000 gic_handle_irq+0x28 (el1_irq+0xc0)
:|+ func -2390 0.862 irq_find_mapping+0x1c
(gic_handle_irq+0x6c)
:|+ func -2390 1.000 __ipipe_grab_irq+0x24
(gic_handle_irq+0x74)
:|+ begin 0x00000004 -2389 0.941 __ipipe_grab_irq+0x44 (<00000000>)
:|+ func -2388 0.843 __ipipe_dispatch_irq+0x20
(__ipipe_grab_irq+0x64)
:|+ func -2387 0.862 irq_to_desc+0x14
(__ipipe_dispatch_irq+0xd4)
:|+ func -2386 0.882 irq_to_desc+0x14
(__ipipe_dispatch_irq+0xe0)
:|+ func -2385 0.980 __ipipe_ack_hrtimer_irq+0x1c
(__ipipe_dispatch_irq+0x74)
:|+ func -2384 0.823 __ipipe_ack_fasteoi_irq+0x14
(__ipipe_ack_hrtimer_irq+0x3c)
:|+ func -2383 0.882 gic_hold_irq+0x14
(__ipipe_ack_fasteoi_irq+0x24)
:|+ func -2382 0.941 arch_itimer_ack_phys+0xc
(__ipipe_ack_hrtimer_irq+0x48)
:|+ func -2381 0.823 __ipipe_end_fasteoi_irq+0x14
(__ipipe_ack_hrtimer_irq+0x54)
:|+ func -2381 1.000 gic_release_irq+0x14
(__ipipe_end_fasteoi_irq+0x28)
:|+ func -2380+ 1.156 dispatch_irq_head+0x28
(__ipipe_dispatch_irq+0x168)
:|# func -2378! 154.705 xnintr_core_clock_handler+0x28
(dispatch_irq_head+0xb8)
:|# func -2224 0.901 ___xnlock_get+0x14
(xnintr_core_clock_handler+0x120)
:|# func -2223 0.901 xnclock_tick+0x24
(xnintr_core_clock_handler+0x12c)
:|# func -2222 0.823 timerfd_handler+0x14
(xnclock_tick+0x108)
:|# func -2221+ 1.019 xnsynch_wakeup_one_sleeper+0x1c
(timerfd_handler+0x40)
:|# func -2220+ 1.098 ___xnlock_get+0x14
(xnsynch_wakeup_one_sleeper+0x54)
:|# func -2219 0.941 xnclock_core_ns_to_ticks+0x14
(xnclock_tick+0x18c)
:|# func -2218 0.882 xnclock_core_local_shot+0x14
(xnclock_tick+0x264)
:|# event tick@-1727 -2217 0.823 xnclock_core_local_shot+0x94
(<00000000>)
:|# func -2216 0.980 ipipe_timer_set+0x1c
(xnclock_core_local_shot+0x98)
:|# func -2215 0.921
arch_timer_set_next_event_phys+0x18 (ipipe_timer_set+0x78)
:|# func -2214! 156.666 ___xnlock_put+0x14
(xnintr_core_clock_handler+0x134)
:|+ end 0x00000004 -2058 0.901 __ipipe_grab_irq+0x70 (<00000000>)
:|+ func -2057 0.921 __ipipe_exit_irq+0x14
(__ipipe_grab_irq+0x74)
:|+ func -2056! 331.666
__ipipe_check_root_interruptible+0x18 (el1_irq+0xe4)
:|+ func -1724 0.980 gic_handle_irq+0x28
(el0_irq_naked+0x54)
:|+ func -1723 0.862 irq_find_mapping+0x1c
(gic_handle_irq+0x6c)
:|+ func -1722 0.980 __ipipe_grab_irq+0x24
(gic_handle_irq+0x74)
:|+ begin 0x00000004 -1721 0.901 __ipipe_grab_irq+0x44 (<00000000>)
:|+ func -1721 0.823 __ipipe_dispatch_irq+0x20
(__ipipe_grab_irq+0x64)
:|+ func -1720 0.843 irq_to_desc+0x14
(__ipipe_dispatch_irq+0xd4)
:|+ func -1719 0.862 irq_to_desc+0x14
(__ipipe_dispatch_irq+0xe0)
:|+ func -1718 0.960 __ipipe_ack_hrtimer_irq+0x1c
(__ipipe_dispatch_irq+0x74)
:|+ func -1717 0.843 __ipipe_ack_fasteoi_irq+0x14
(__ipipe_ack_hrtimer_irq+0x3c)
:|+ func -1716 0.862 gic_hold_irq+0x14
(__ipipe_ack_fasteoi_irq+0x24)
:|+ func -1715 0.921 arch_itimer_ack_phys+0xc
(__ipipe_ack_hrtimer_irq+0x48)
:|+ func -1714 0.823 __ipipe_end_fasteoi_irq+0x14
(__ipipe_ack_hrtimer_irq+0x54)
:|+ func -1714 1.000 gic_release_irq+0x14
(__ipipe_end_fasteoi_irq+0x28)
:|+ func -1713+ 1.156 dispatch_irq_head+0x28
(__ipipe_dispatch_irq+0x168)
:|# func -1711+ 1.058 xnintr_core_clock_handler+0x28
(dispatch_irq_head+0xb8)
:|# func -1710 0.921 ___xnlock_get+0x14
(xnintr_core_clock_handler+0x120)
:|# func -1709 0.901 xnclock_tick+0x24
(xnintr_core_clock_handler+0x12c)
:|# func -1709 0.823 timerfd_handler+0x14
(xnclock_tick+0x108)
:|# func -1708+ 1.019 xnsynch_wakeup_one_sleeper+0x1c
(timerfd_handler+0x40)
:|# func -1707+ 1.098 ___xnlock_get+0x14
(xnsynch_wakeup_one_sleeper+0x54)
:|# func -1706 0.941 xnclock_core_ns_to_ticks+0x14
(xnclock_tick+0x18c)
:|# func -1705 0.882 xnclock_core_local_shot+0x14
(xnclock_tick+0x264)
:|# event tick@-747 -1704 0.823 xnclock_core_local_shot+0x94
(<00000000>)
:|# func -1703 0.960 ipipe_timer_set+0x1c
(xnclock_core_local_shot+0x98)
:|# func -1702 0.941
arch_timer_set_next_event_phys+0x18 (ipipe_timer_set+0x78)
:|# func -1701+ 1.372 ___xnlock_put+0x14
(xnintr_core_clock_handler+0x134)
:|+ end 0x00000004 -1700 0.823 __ipipe_grab_irq+0x70 (<00000000>)
:|+ func -1699 0.960 __ipipe_exit_irq+0x14
(__ipipe_grab_irq+0x74)
:|+ func -1698! 954.058
__ipipe_check_root_interruptible+0x18 (el0_irq_naked+0x78)
:|+ func -744 0.960 gic_handle_irq+0x28
(el0_irq_naked+0x54)
:|+ func -743 0.862 irq_find_mapping+0x1c
(gic_handle_irq+0x6c)
:|+ func -742 0.941 __ipipe_grab_irq+0x24
(gic_handle_irq+0x74)
:|+ begin 0x00000004 -741 0.901 __ipipe_grab_irq+0x44 (<00000000>)
:|+ func -740 0.862 __ipipe_dispatch_irq+0x20
(__ipipe_grab_irq+0x64)
:|+ func -739 0.843 irq_to_desc+0x14
(__ipipe_dispatch_irq+0xd4)
:|+ func -738 0.882 irq_to_desc+0x14
(__ipipe_dispatch_irq+0xe0)
:|+ func -738 0.960 __ipipe_ack_hrtimer_irq+0x1c
(__ipipe_dispatch_irq+0x74)
:|+ func -737 0.843 __ipipe_ack_fasteoi_irq+0x14
(__ipipe_ack_hrtimer_irq+0x3c)
:|+ func -736 0.862 gic_hold_irq+0x14
(__ipipe_ack_fasteoi_irq+0x24)
:|+ func -735 0.921 arch_itimer_ack_phys+0xc
(__ipipe_ack_hrtimer_irq+0x48)
:|+ func -734 0.823 __ipipe_end_fasteoi_irq+0x14
(__ipipe_ack_hrtimer_irq+0x54)
:|+ func -733 0.980 gic_release_irq+0x14
(__ipipe_end_fasteoi_irq+0x28)
:|+ func -732+ 1.156 dispatch_irq_head+0x28
(__ipipe_dispatch_irq+0x168)
:|# func -731+ 1.039 xnintr_core_clock_handler+0x28
(dispatch_irq_head+0xb8)
:|# func -730 0.901 ___xnlock_get+0x14
(xnintr_core_clock_handler+0x120)
:|# func -729 0.901 xnclock_tick+0x24
(xnintr_core_clock_handler+0x12c)
:|# func -728 0.823 timerfd_handler+0x14
(xnclock_tick+0x108)
:|# func -727+ 1.019 xnsynch_wakeup_one_sleeper+0x1c
(timerfd_handler+0x40)
:|# func -726+ 1.078 ___xnlock_get+0x14
(xnsynch_wakeup_one_sleeper+0x54)
:|# func -725 0.921 xnclock_core_ns_to_ticks+0x14
(xnclock_tick+0x18c)
:|# func -724 0.882 xnclock_core_local_shot+0x14
(xnclock_tick+0x264)
:|# event tick@233 -723 0.823 xnclock_core_local_shot+0x94
(<00000000>)
:|# func -723 0.980 ipipe_timer_set+0x1c
(xnclock_core_local_shot+0x98)
:|# func -722 0.921
arch_timer_set_next_event_phys+0x18 (ipipe_timer_set+0x78)
:|# func -721+ 1.313 ___xnlock_put+0x14
(xnintr_core_clock_handler+0x134)
:|+ end 0x00000004 -719 0.862 __ipipe_grab_irq+0x70 (<00000000>)
:|+ func -719 0.960 __ipipe_exit_irq+0x14
(__ipipe_grab_irq+0x74)
:|+ func -718! 301.392
__ipipe_check_root_interruptible+0x18 (el0_irq_naked+0x78)
: + func -416 0.823 ipipe_fastcall_hook+0x14
(el0_svc_naked+0x20)
: + func -415! 162.980 handle_head_syscall+0x24
(ipipe_fastcall_hook+0x24)
: + func -252! 164.117 CoBaLt_trace+0x24
(handle_head_syscall+0x118)
: + func -88 0.823 ipipe_trace_frozen_reset+0x2c
(CoBaLt_trace+0x168)
: + func -87! 82.411 __ipipe_global_path_lock+0xc
(ipipe_trace_frozen_reset+0x34)
: + func -5 0.882 __ipipe_spin_lock_irqsave+0x14
(__ipipe_global_path_lock+0x1c)
:|+ begin 0x80000001 -4+ 2.607 __ipipe_spin_lock_irqsave+0xac
(<00000000>)
:|# func -2+ 1.098
__ipipe_spin_unlock_irqcomplete+0x18 (__ipipe_global_path_unlock+0x98)
:|+ end 0x80000001 0 0.941
__ipipe_spin_unlock_irqcomplete+0x30 (<00000000>)
< + freeze 0x007a7920 0 1.411 CoBaLt_trace+0x178 (<00000000>)
+ func 1 0.901 ipipe_fastcall_hook+0x14
(el0_svc_naked+0x20)
+ func 2 0.921 handle_head_syscall+0x24
(ipipe_fastcall_hook+0x24)
+ func 3 0.862 CoBaLt_read+0x20
(handle_head_syscall+0x118)
+ func 4 0.843 rtdm_fd_read+0x28
(CoBaLt_read+0x30)
+ func 4 0.843 get_fd_fixup_mode+0x1c
(rtdm_fd_read+0x30)
+ func 5 0.960 rtdm_fd_get+0x24
(get_fd_fixup_mode+0x28)
|+ begin 0x80000000 6 1.078 rtdm_fd_get+0x17c (<00000000>)
|# func 7 1.019 ___xnlock_get+0x14
(rtdm_fd_get+0x6c)
|# func 8 1.058 ___xnlock_put+0x14
(rtdm_fd_get+0x140)
|# func 9 0.000 __ipipe_restore_head+0x20
(rtdm_fd_get+0xd4)
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2019-11-19 8:23 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <25135.7772549213$1574125359@news.gmane.org>
2019-11-19 6:49 ` hith latency when cpu is fully loaded Jan Kiszka
2019-11-19 7:45 ` chensong
2019-11-19 8:03 ` Jan Kiszka
2019-11-19 8:23 ` chensong
2019-11-19 1:01 chensong
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.