DAHDI timing and ASL


Steve N4IRS
 
Edited

Along with making ASL more "DVSwitch friendly, We are going to tackle some of the issues that have been bugging (no pun intended) us. First on the list is DAHDI timing. ASL is built with Asterisk 1.4.23 and DAHDI 2.11. I quick Google search will turn up quite a few messages detailing on how important DAHDI timing is to proper Asterisk conference operation. Some of you know that the HAMVIOP fork of the ASL source pushes this as an important difference between ASL and HAMVIOP. I can't really say that I have seen issues in either real hardware or hosted VM based ASL nodes but if timing is important, it's to our advantage to make it the best we can. ASL gets it's timing from DAHDI. DAHDI prefers a hardware source for the clock but if none is available, DAHDI can generate the clock from the host itself. For DAHDI to use the High Resolution Timer in the host, a second DAHDI kernel module is needed. That module is dahdi_dummy. The version of DAHDI shipped with ASL does not include building and installing dahdi_dummy. Since I was the one that packaged DAHDI, all I can say is oops. Below is a timing test I ran on a HP DL360 G5. This is a actual server running Stretch but you will see improvement on a VM or a SBC like the Pi. First we will run without dahdi_dummy.

root@demo:/home/szingman# lsmod | grep dahdi
dahdi                 229376  0
crc_ccitt              16384  1 dahdi

root@demo:/home/szingman# dahdi_test -c 100
Opened pseudo dahdi interface, measuring accuracy...
99.608% 99.996% 99.999% 99.218% 99.997% 99.999% 99.999% 99.999%
99.606% 99.998% 99.999% 99.999% 99.610% 99.999% 99.999% 99.999%
99.999% 99.999% 99.999% 99.999% 99.999% 99.999% 99.999% 99.999%
99.999% 99.999% 99.999% 99.220% 99.220% 99.218% 99.222% 99.999%
99.999% 99.998% 99.999% 99.999% 99.999% 99.999% 99.999% 99.218%
99.222% 99.219% 99.999% 99.222% 99.999% 99.997% 99.999% 99.999%
99.999% 99.999% 99.999% 99.220% 99.222% 99.999% 99.999% 99.999%
99.999% 99.996% 99.999% 99.999% 99.999% 99.999% 99.999% 99.999%
99.999% 99.998% 99.999% 99.999% 99.220% 99.220% 99.997% 99.999%
99.999% 99.999% 99.999% 99.999% 99.999% 99.999% 99.999% 99.999%
99.220% 99.223% 99.220% 99.222% 99.999% 99.999% 99.997% 99.999%
99.999% 99.999% 99.999% 99.999% 99.999% 99.999% 99.999% 99.999%
99.999% 100.000%
--- Results after 98 passes ---
Best: 100.000% -- Worst: 99.218% -- Average: 99.851760%
Cumulative Accuracy (not per pass): 99.997

root@demo:/usr/src/asl-dahdi-linux-2.11.1# dahdi_scan
NO OUTPUT at all

Now we will run after adding dahdi_dummy

root@demo:/home/szingman# lsmod | grep dahdi
dahdi_dummy            16384  0
dahdi                 229376  1 dahdi_dummy
crc_ccitt              16384  1 dahdi

root@demo:/home/szingman# dahdi_test -c 100
Opened pseudo dahdi interface, measuring accuracy...
99.998% 99.996% 99.999% 99.999% 99.999% 99.999% 99.999% 99.999%
99.999% 99.998% 99.999% 99.999% 99.999% 99.999% 99.999% 99.999%
99.999% 99.998% 99.999% 99.999% 99.999% 99.999% 99.999% 99.999%
99.999% 99.998% 99.999% 99.999% 99.999% 99.999% 99.999% 99.999%
99.999% 99.998% 99.999% 99.999% 99.999% 99.999% 99.999% 99.999%
99.999% 99.998% 99.999% 99.999% 99.999% 99.999% 99.999% 99.999%
99.999% 99.998% 99.999% 99.999% 99.999% 99.999% 99.994% 99.999%
99.999% 99.998% 99.999% 99.999% 99.999% 99.999% 99.999% 99.999%
99.999% 99.998% 99.999% 99.999% 99.999% 99.999% 99.999% 99.999%
99.999% 99.998% 99.999% 99.999% 99.999% 99.999% 99.999% 99.999%
99.999% 99.998% 99.999% 99.999% 99.999% 99.999% 99.999% 99.999%
99.999% 99.998% 99.999% 99.999% 99.999% 99.999% 99.999% 99.999%
99.999% 99.998%
--- Results after 98 passes ---
Best: 99.999% -- Worst: 99.994% -- Average: 99.998769%
Cumulative Accuracy (not per pass): 99.999

root@demo:/home/szingman# dahdi_scan
[1]
active=yes
alarms=UNCONFIGURED
description=DAHDI_DUMMY/1 (source: HRtimer) 1
name=DAHDI_DUMMY/1
manufacturer=
devicetype=DAHDI Dummy Timing
location=
basechan=1
totchans=0
irq=0

As you can see there is a improvement. Not a big improvement in this case but there is a difference. We have tested on a few different platforms and all exhibit a improvement. It's actually easy to build and install the dahdi_dummy module.

As root:
edit /usr/src/asl-dahdi-linux-2.11.1/linux/drivers/dahdi/Kbuild
change:
#obj-$(DAHDI_BUILD_ALL)$(CONFIG_DAHDI_DUMMY)             += dahdi_dummy.o     
to:
obj-$(DAHDI_BUILD_ALL)$(CONFIG_DAHDI_DUMMY)             += dahdi_dummy.o
save your work.

cd to /usr/src/asl-dahdi-linux-2.11.1
run:
make install
Once make completes, test your work:
modprobe dahdi_dummy
You should see:
root@demo:/home/szingman# lsmod | grep dahdi
dahdi_dummy            16384  0
dahdi                 229376  1 dahdi_dummy
crc_ccitt              16384  1 dahdi

If you do, the module is built and can be installed.
Now we will load it at boot.
edit /etc/modules
add dahdi_dummy above dahdi
save your work
reboot

This was discovered by Bryan W9CR. He compared the binary for dahdi_dummy with what HAMVOIP calls dahdi_hrtimer. A comparison using strings turns up some glaring similarities and differences. I'll leave this to the community to decide.
Here are some other tests and results. Note: some eagle eyed users will notice some of these tests were not run on the HP DL360 G5. I do not have ASL installed on that machine yet, only DAHDI:

Before:
root@repeater:/home/szingman# lsmod | grep dahdi
dahdi                 229376  0
crc_ccitt              16384  1 dahdi

root@repeater:/home/repeater# asterisk -r

AllStarLink Asterisk Version 1.01 2/13/2018 GIT Version adaec47
=========================================================================
Connected to Asterisk GIT Version adaec47 currently running on repeater (pid = 353)
repeater*CLI> dahdi show status
Description                              Alarms     IRQ        bpviol     CRC4
repeater*CLI> exit

After:
root@repeater:/home/repeater# modprobe dahdi_dummy
root@repeater:/home/repeater# lsmod | grep dahdi
dahdi_dummy             3538  0
dahdi                 233213  27 dahdi_dummy
crc_ccitt               1835  1 dahdi


root@repeater:/home/repeater# asterisk -r

AllStarLink Asterisk Version 1.01 2/13/2018 GIT Version adaec47
=========================================================================
Connected to Asterisk GIT Version adaec47 currently running on repeater (pid = 353)
repeater*CLI> dahdi show status
Description                              Alarms     IRQ        bpviol     CRC4
DAHDI_DUMMY/1 (source: HRtimer) 1        UNCONFIGUR 0          0          0
repeater*CLI>

<

https://elinux.org/High_Resolution_Timers#How_to_detect_if_your_timer_system_supports_high_resolution>

Here are some things to check:

1. Check the resolution reported for your clocks. If your clock supports high resolution, it will have a .resolution value of 1 nsecs. If it does not, then it will have a .resolution value that equals the number of nanoseconds in a jiffy (usually 10000 nsecs, on embedded platforms).

2. Check the event_handler for the Tick Device. If the event handlers is 'hrtimer_interrupt' then the clock is set up for high resolution handling. If the event handler is 'tick_handle_periodic', then the device is set up for regular tick-based handling.

3. Check the list of timers, and see if the attribute .hres_active has a value of 1. If so, then the high resolution timer feature is active.


root@repeater:/home/repeater# cat /proc/timer_list
Timer List Version: v0.8
HRTIMER_MAX_CLOCK_BASES: 4
now at 927502067184 nsecs

cpu: 0
 clock 0:
  .base:       df91dd80
  .index:      0
  .resolution: 1 nsecs
  .get_time:   ktime_get
  .offset:     0 nsecs
active timers:
 #0: zaptimer, dahdi_dummy_hr_int, S:01, init_module, systemd-modules/189
 # expires at 927506314625-927506314625 nsecs [in 4247441 to 4247441 nsecs]
 #1: <df91e020>, tick_sched_timer, S:01, tick_nohz_restart, swapper/0/0
 # expires at 927508000000-927508000000 nsecs [in 5932816 to 5932816 nsecs]
 #2: <dacffa30>, hrtimer_wakeup, S:01, schedule_hrtimeout_range_clock, asterisk/458
 # expires at 927520910752-927520960752 nsecs [in 18843568 to 18893568 nsecs]
 #3: <dabeda30>, hrtimer_wakeup, S:01, schedule_hrtimeout_range_clock, asterisk/419
 # expires at 927728645724-927729645716 nsecs [in 226578540 to 227578532 nsecs]
 #4: <dc665a30>, hrtimer_wakeup, S:01, schedule_hrtimeout_range_clock, asterisk/372
 # expires at 927948646756-927953646748 nsecs [in 446579572 to 451579564 nsecs]
 #5: <df91e138>, watchdog_timer_fn, S:01, watchdog_enable, watchdog/0/11
 # expires at 928092000000-928092000000 nsecs [in 589932816 to 589932816 nsecs]
 #6: <dad8fee8>, hrtimer_wakeup, S:01, do_nanosleep.constprop.5, asterisk/418
 # expires at 928413787609-928413837609 nsecs [in 911720425 to 911770425 nsecs]
 #7: <dc3b6800>, timerfd_tmrproc, S:01, SyS_timerfd_settime, systemd-udevd/230
 # expires at 940154557000-940154557000 nsecs [in 12652489816 to 12652489816 nsecs]
 #8: <dc3b6a00>, timerfd_tmrproc, S:01, SyS_timerfd_settime, systemd-journal/184
 # expires at 940154557000-940154557000 nsecs [in 12652489816 to 12652489816 nsecs]
 #9: <dc3b6000>, timerfd_tmrproc, S:01, SyS_timerfd_settime, systemd/1
 # expires at 940154557000-940154557000 nsecs [in 12652489816 to 12652489816 nsecs]
 #10: <dc6cdee8>, hrtimer_wakeup, S:01, do_nanosleep.constprop.5, cron/381
 # expires at 949573630626-949573680626 nsecs [in 22071563442 to 22071613442 nsecs]
 #11: <dc413ee8>, hrtimer_wakeup, S:01, do_nanosleep.constprop.5, sleep/654
 # expires at 953799741074-953799791074 nsecs [in 26297673890 to 26297723890 nsecs]
 #12: sched_clock_timer, sched_clock_poll, S:01, sched_clock_postinit, swapper/0/0
 # expires at 984263334681-984263334681 nsecs [in 56761267497 to 56761267497 nsecs]
 #13: <daadd500>, timerfd_tmrproc, S:01, SyS_timerfd_settime, systemd-logind/377
 # expires at 1000154557000-1000154557000 nsecs [in 72652489816 to 72652489816 nsecs]
 #14: <daacf600>, timerfd_tmrproc, S:01, SyS_timerfd_settime, systemd-timesyn/334
 # expires at 1000154557000-1000154557000 nsecs [in 72652489816 to 72652489816 nsecs]
 #15: <db1b5a30>, hrtimer_wakeup, S:01, schedule_hrtimeout_range_clock, rsyslogd/353
 # expires at 1211996410283-1212096410283 nsecs [in 284494343099 to 284594343099 nsecs]
 #16: <dace3ee8>, hrtimer_wakeup, S:01, do_nanosleep.constprop.5, asterisk/371
 # expires at 1217714212774-1217714262774 nsecs [in 290212145590 to 290212195590 nsecs]
 #17: <dc6a1a30>, hrtimer_wakeup, S:01, schedule_hrtimeout_range_clock, dhclient/474
 # expires at 36579226391252-36579326391252 nsecs [in 35651724324068 to 35651824324068 nsecs]
 clock 1:
  .base:       df91ddc0
  .index:      1
  .resolution: 1 nsecs
  .get_time:   ktime_get_real
  .offset:     1570714932000715417 nsecs
active timers:
 #0: <daadd200>, timerfd_tmrproc, S:01, SyS_timerfd_settime, systemd/1
 # expires at 1570716580154557000-1570716580154557000 nsecs [in 720651774399 to 720651774399 nsecs]
 #1: <da930800>, timerfd_tmrproc, S:01, SyS_timerfd_settime, systemd/1
 # expires at 2147483647000000000-2147483647000000000 nsecs [in 576767787497217399 to 576767787497217399 nsecs]
 #2: <daadde00>, timerfd_tmrproc, S:01, SyS_timerfd_settime, systemd-timesyn/334
 # expires at 2147483647000000000-2147483647000000000 nsecs [in 576767787497217399 to 576767787497217399 nsecs]
 #3: <dc645b00>, timerfd_tmrproc, S:01, SyS_timerfd_settime, systemd/570
 # expires at 2147483647000000000-2147483647000000000 nsecs [in 576767787497217399 to 576767787497217399 nsecs]
 clock 2:
  .base:       df91de00
  .index:      2
  .resolution: 1 nsecs
  .get_time:   ktime_get_boottime
  .offset:     0 nsecs
active timers:
 #0: <dc6db500>, timerfd_tmrproc, S:01, SyS_timerfd_settime, systemd-timesyn/334
 # expires at 1045654557000-1045654557000 nsecs [in 118152489816 to 118152489816 nsecs]
 clock 3:
  .base:       df91de40
  .index:      3
  .resolution: 1 nsecs
  .get_time:   ktime_get_clocktai
  .offset:     1570714932000715417 nsecs
active timers:
  .expires_next   : 927506314625 nsecs
  .hres_active    : 1
  .nr_events      : 942016
  .nr_retries     : 42
  .nr_hangs       : 0
  .max_hang_time  : 0
  .nohz_mode      : 2
  .last_tick      : 927488000000 nsecs
  .tick_stopped   : 0
  .idle_jiffies   : 156871
  .idle_calls     : 912199
  .idle_sleeps    : 879117
  .idle_entrytime : 927492366427 nsecs
  .idle_waketime  : 927492366427 nsecs
  .idle_exittime  : 927492554513 nsecs
  .idle_sleeptime : 697520844910 nsecs
  .iowait_sleeptime: 6054951872 nsecs
  .last_jiffies   : 156872
  .next_timer     : 927520000000
  .idle_expires   : 927520000000 nsecs
jiffies: 156876

Tick Device: mode:     1
Broadcast device
Clock Event Device: <NULL>
tick_broadcast_mask: 0
tick_broadcast_oneshot_mask: 0

Tick Device: mode:     1
Per CPU device: 0
Clock Event Device: timer2
 max_delta_ns:   178956969070
 min_delta_ns:   1000
 mult:           51539608
 shift:          31
 mode:           3
 next_event:     927506314625 nsecs
 set_next_event: omap2_gp_timer_set_next_event
 shutdown: omap2_gp_timer_shutdown
 periodic: omap2_gp_timer_set_periodic
 oneshot:  omap2_gp_timer_shutdown
 resume:   omap2_gp_timer_shutdown
 event_handler:  hrtimer_interrupt
 retries:        104

73, Steve N4IRS


Steve N4IRS
 

This is the result on dvswitch.org. It is a VM on VMware.

root@dvswitch:/var/log/asterisk# dahdi_test -c 100
Opened pseudo dahdi interface, measuring accuracy...
99.997% 99.994% 99.998% 99.999% 99.994% 99.991% 99.996% 99.998%
99.999% 99.994% 99.999% 99.996% 99.998% 99.990% 99.998% 99.999%
99.995% 99.998% 99.998% 99.995% 99.998% 99.997% 99.998% 99.997%
99.997% 99.999% 99.999% 99.991% 99.998% 99.998% 99.996% 99.999%
99.998% 99.997% 99.998% 99.995% 99.998% 99.997% 99.997% 99.997%
99.998% 99.998% 99.998% 99.997% 99.997% 99.999% 99.996% 99.999%
99.992% 99.997% 99.999% 99.993% 99.988% 99.997% 99.999% 99.997%
99.998% 99.994% 99.995% 99.999% 99.996% 99.999% 99.996% 99.994%
99.998% 99.997% 99.999% 100.000% 99.991% 99.998% 99.998% 99.997%
99.995% 99.998% 99.997% 99.998% 99.997% 99.994% 99.991% 99.987%
99.996% 99.999% 99.999% 100.000% 99.992% 100.000% 99.996% 99.997%
99.995% 99.990% 99.996% 99.999% 99.995% 99.998% 99.997% 99.998%
99.998% 99.996%
--- Results after 98 passes ---
Best: 100.000% -- Worst: 99.987% -- Average: 99.996541%
Cumulative Accuracy (not per pass): 99.997
 


Steve N4IRS
 

This is on an Atom

root@omv:/usr/src/asl-dahdi-linux-2.11.1# lsmod | grep dahdi
dahdi                 212992  0
crc_ccitt              16384  1 dahdi

root@omv:/usr/src/asl-dahdi-linux-2.11.1# dahdi_test -c 100
Opened pseudo dahdi interface, measuring accuracy...
99.996% 99.992% 99.996% 99.996% 99.996% 99.996% 99.996% 99.996%
99.996% 99.992% 99.996% 99.997% 99.996% 99.996% 99.996% 99.996%
99.996% 99.993% 99.996% 99.996% 99.223% 99.215% 99.223% 99.215%
99.996% 99.993% 99.996% 99.996% 99.222% 99.996% 99.997% 99.215%
99.222% 99.212% 99.996% 99.997% 99.223% 99.215% 99.996% 99.613%
99.996% 99.995% 99.996% 99.996% 99.996% 99.997% 99.996% 99.997%
99.996% 99.995% 99.996% 99.614% 99.215% 99.996% 99.996% 99.223%
99.996% 99.214% 99.223% 99.215% 99.996% 99.996% 99.222% 99.215%
99.222% 99.212% 99.996% 99.223% 99.215% 99.996% 99.222% 99.996%
99.215% 99.224% 99.215% 99.996% 99.222% 99.215% 99.996% 99.222%
99.996% 99.212% 99.222% 99.996% 99.215% 99.996% 99.223% 99.996%
99.996% 99.212% 99.996% 99.996% 99.996% 99.996% 99.222% 99.215%
99.996% 99.225%
--- Results after 98 passes ---
Best: 99.997% -- Worst: 99.212% -- Average: 99.702537%
Cumulative Accuracy (not per pass): 99.996
root@omv:/usr/src/asl-dahdi-linux-2.11.1#
root@omv:/usr/src/asl-dahdi-linux-2.11.1# modprobe dahdi_dummy

root@omv:/usr/src/asl-dahdi-linux-2.11.1# lsmod | grep dahdi
dahdi_dummy            16384  0
dahdi                 212992  1 dahdi_dummy
crc_ccitt              16384  1 dahdi

root@omv:/usr/src/asl-dahdi-linux-2.11.1# dahdi_test -c 100
Opened pseudo dahdi interface, measuring accuracy...
99.995% 99.992% 99.996% 99.997% 99.996% 99.996% 99.996% 99.996%
99.996% 99.994% 99.996% 99.996% 99.996% 99.996% 99.996% 99.996%
99.996% 99.995% 99.996% 99.996% 99.997% 99.995% 99.997% 99.996%
99.996% 99.994% 99.996% 99.996% 99.997% 99.996% 99.996% 99.997%
99.996% 99.993% 99.997% 99.996% 99.996% 99.996% 99.997% 99.995%
99.996% 99.994% 99.996% 99.996% 99.996% 99.996% 99.997% 99.996%
99.996% 99.994% 99.997% 99.996% 99.996% 99.996% 99.996% 99.996%
99.997% 99.994% 99.997% 99.996% 99.996% 99.997% 99.995% 99.997%
99.996% 99.995% 99.995% 99.997% 99.996% 99.996% 99.997% 99.996%
99.996% 99.995% 99.995% 99.996% 99.996% 99.996% 99.996% 99.997%
99.996% 99.995% 99.996% 99.997% 99.996% 99.997% 99.996% 99.996%
99.996% 99.995% 99.996% 99.997% 99.997% 99.995% 99.996% 99.996%
99.996% 99.996%
--- Results after 98 passes ---
Best: 99.997% -- Worst: 99.992% -- Average: 99.995937%
Cumulative Accuracy (not per pass): 99.996

root@omv:/usr/src/asl-dahdi-linux-2.11.1# dmidecode | more
# dmidecode 3.0
Handle 0x0004, DMI type 4, 42 bytes
Processor Information
    Socket Designation: CPU 1
    Type: Central Processor
    Family: Atom
    Manufacturer: Intel            
    ID: CA 06 01 00 FF FB EB BF
    Signature: Type 0, Family 6, Model 28, Stepping 10
    Version: Intel(R) Atom(TM) CPU D510   @ 1.66GHz              
    Voltage: 1.1 V
    External Clock: 167 MHz
    Max Speed: 1666 MHz
    Current Speed: 1666 MHz
    Status: Populated, Enabled
    Upgrade: Socket LGA775
    L1 Cache Handle: 0x0005


G7RPG - Peter Kendall
 

Hi Steve,

Brilliant work. Just rolled it out across 6 VPS hubs.

 

Sample results:

Before (KVM based VPS)

Opened pseudo dahdi interface, measuring accuracy...
100.000% 99.993% 99.999% 99.997% 99.994% 99.998% 99.997% 99.999%
99.996% 99.993% 99.993% 99.999% 99.993% 99.996% 99.997% 99.982%
99.987% 99.981% 100.000% 99.993% 99.987% 99.985% 99.997% 99.981%
99.991% 99.622% 99.997% 99.991% 99.985% 99.980% 99.984% 99.990%
99.988% 99.989% 99.984% 99.999% 99.996% 99.990% 99.997% 99.997%
99.994% 99.997% 99.999% 99.997% 99.976% 99.998% 99.997% 99.995%
99.993% 99.995% 99.996% 99.990% 99.992% 99.996% 99.992% 100.000%
99.995% 99.995% 99.998% 99.983% 99.984% 99.979% 99.993% 99.996%
99.998% 99.993% 99.996% 99.994% 99.978% 99.997% 99.999% 99.997%
99.610% 99.983% 99.205% 99.225% 99.993% 100.000% 99.238% 99.234%
99.992% 99.995% 99.993% 99.211% 99.210% 99.219% 99.211% 99.997%
99.991% 99.992% 99.992% 99.994% 99.980% 99.999% 99.212% 99.222%
99.991% 100.000%
--- Results after 98 passes ---
Best: 100.000% -- Worst: 99.205% -- Average: 99.906028%
Cumulative Accuracy (not per pass): 99.998

After (KVM based VPS)

Opened pseudo dahdi interface, measuring accuracy...
99.990% 99.993% 99.998% 99.998% 99.999% 99.998% 99.999% 99.993%
99.998% 100.000% 99.996% 99.997% 99.998% 99.997% 99.999% 99.997%
99.998% 99.999% 99.997% 99.998% 99.998% 99.998% 99.998% 99.999%
99.999% 99.996% 99.998% 99.997% 99.999% 99.998% 99.997% 99.998%
99.998% 99.996% 99.997% 99.998% 99.996% 99.999% 99.997% 99.998%
99.999% 99.998% 99.998% 99.999% 99.996% 100.000% 99.995% 99.998%
99.998% 99.998% 99.998% 100.000% 99.998% 99.997% 99.999% 99.996%
99.998% 99.998% 99.997% 100.000% 99.995% 99.999% 99.996% 99.998%
99.997% 99.998% 99.998% 99.997% 99.998% 99.999% 99.997% 99.997%
100.000% 99.998% 99.996% 99.998% 99.997% 99.998% 99.998% 99.998%
99.999% 99.997% 99.998% 99.998% 99.998% 100.000% 99.996% 99.998%
99.994% 99.998% 99.998% 99.997% 99.997% 99.998% 99.999% 99.997%
99.998% 99.998%
--- Results after 98 passes ---
Best: 100.000% -- Worst: 99.990% -- Average: 99.997611%
Cumulative Accuracy (not per pass): 99.998


Best 73

Peter

G7RPG


Steve N4IRS
 

Peter,
Thanks for the result output. Looks great. As I said in my post, Bryan W9CR is the person that discovered what needed to be added.

73, Steve N4IRS

On 11/6/19 4:16 AM, G7RPG - Peter Kendall wrote:

Hi Steve,

Brilliant work. Just rolled it out across 6 VPS hubs.

 

Sample results:

Before (KVM based VPS)

Opened pseudo dahdi interface, measuring accuracy...
100.000% 99.993% 99.999% 99.997% 99.994% 99.998% 99.997% 99.999%
99.996% 99.993% 99.993% 99.999% 99.993% 99.996% 99.997% 99.982%
99.987% 99.981% 100.000% 99.993% 99.987% 99.985% 99.997% 99.981%
99.991% 99.622% 99.997% 99.991% 99.985% 99.980% 99.984% 99.990%
99.988% 99.989% 99.984% 99.999% 99.996% 99.990% 99.997% 99.997%
99.994% 99.997% 99.999% 99.997% 99.976% 99.998% 99.997% 99.995%
99.993% 99.995% 99.996% 99.990% 99.992% 99.996% 99.992% 100.000%
99.995% 99.995% 99.998% 99.983% 99.984% 99.979% 99.993% 99.996%
99.998% 99.993% 99.996% 99.994% 99.978% 99.997% 99.999% 99.997%
99.610% 99.983% 99.205% 99.225% 99.993% 100.000% 99.238% 99.234%
99.992% 99.995% 99.993% 99.211% 99.210% 99.219% 99.211% 99.997%
99.991% 99.992% 99.992% 99.994% 99.980% 99.999% 99.212% 99.222%
99.991% 100.000%
--- Results after 98 passes ---
Best: 100.000% -- Worst: 99.205% -- Average: 99.906028%
Cumulative Accuracy (not per pass): 99.998

After (KVM based VPS)

Opened pseudo dahdi interface, measuring accuracy...
99.990% 99.993% 99.998% 99.998% 99.999% 99.998% 99.999% 99.993%
99.998% 100.000% 99.996% 99.997% 99.998% 99.997% 99.999% 99.997%
99.998% 99.999% 99.997% 99.998% 99.998% 99.998% 99.998% 99.999%
99.999% 99.996% 99.998% 99.997% 99.999% 99.998% 99.997% 99.998%
99.998% 99.996% 99.997% 99.998% 99.996% 99.999% 99.997% 99.998%
99.999% 99.998% 99.998% 99.999% 99.996% 100.000% 99.995% 99.998%
99.998% 99.998% 99.998% 100.000% 99.998% 99.997% 99.999% 99.996%
99.998% 99.998% 99.997% 100.000% 99.995% 99.999% 99.996% 99.998%
99.997% 99.998% 99.998% 99.997% 99.998% 99.999% 99.997% 99.997%
100.000% 99.998% 99.996% 99.998% 99.997% 99.998% 99.998% 99.998%
99.999% 99.997% 99.998% 99.998% 99.998% 100.000% 99.996% 99.998%
99.994% 99.998% 99.998% 99.997% 99.997% 99.998% 99.999% 99.997%
99.998% 99.998%
--- Results after 98 passes ---
Best: 100.000% -- Worst: 99.990% -- Average: 99.997611%
Cumulative Accuracy (not per pass): 99.998


Best 73

Peter

G7RPG



G7RPG - Peter Kendall
 

My Bad,
Thanks Bryan, really appropriated.

Just to add a bit more to this.

Hamvoip on RPi4

--- Results after 210 passes ---
Best: 100.000% -- Worst: 99.940% -- Average: 99.993608%

Hamvoip on RPi2

--- Results after 152 passes ---
Best: 99.992% -- Worst: 99.969% -- Average: 99.982241%
Cummulative Accuracy (not per pass): 99.982


Peter

 


Andrew Koenig
 

Steve,

This really seemed to do the trick with the dahdi_test results. I'm really looking forward to audio reports from users.

Any idea on why that line was commented out?

I'll be sure to pass the thanks along to Bryan as well.

73 de KE5GDB

====================

From an RPi 2B+ w/ ASL 1.01:

root@43776-BridgePi:~# dahdi_test -c 100
Opened pseudo dahdi interface, measuring accuracy...
99.618% 99.565% 99.620% 99.631% 98.447% 99.601% 99.602% 99.603%
99.601% 98.445% 99.598% 99.601% 99.585% 99.617% 98.436% 99.593%
99.601% 99.601% 99.597% 98.441% 99.603% 99.601% 99.572% 99.630%
98.445% 99.600% 99.609% 99.594% 99.592% 98.480% 99.601% 99.647%
99.601% 99.600% 98.445% 99.602% 99.602% 99.573% 99.629% 98.486%
99.600% 99.595% 99.650% 99.601% 98.491% 99.601% 99.599% 99.648%
99.605% 98.508% 99.612% 99.600% 99.648% 99.602% 98.489% 99.583%
99.636% 99.621% 99.607% 98.450% 99.610% 99.593% 99.605% 99.602%
98.444% 99.545% 99.653% 99.600% 99.605% 98.447% 99.592% 99.600%
99.606% 99.600% 98.442% 99.593% 99.605% 99.598% 99.610% 98.456%
99.537% 99.626% 99.639% 99.611% 98.450% 99.601% 99.602% 99.601%
99.603% 98.447% 99.602% 99.601% 99.602% 99.613% 98.450% 99.597%
99.601% 99.600%
--- Results after 98 passes ---
Best: 99.653% -- Worst: 98.436% -- Average: 99.382118%
Cumulative Accuracy (not per pass): 99.980
root@43776-BridgePi:~# modprobe dahdi_dummy
root@43776-BridgePi:~# dahdi_test -c 100
Opened pseudo dahdi interface, measuring accuracy...
99.986% 99.981% 99.991% 99.992% 99.991% 99.992% 99.992% 99.992%
99.993% 99.988% 99.992% 99.992% 99.992% 99.993% 99.991% 99.991%
99.991% 99.991% 99.992% 99.990% 99.992% 99.992% 99.991% 99.993%
99.991% 99.991% 99.991% 99.992% 99.992% 99.991% 99.992% 99.992%
99.991% 99.991% 99.991% 99.992% 99.991% 99.992% 99.992% 99.991%
99.992% 99.991% 99.992% 99.992% 99.991% 99.992% 99.992% 99.992%
99.992% 99.990% 99.992% 99.992% 99.992% 99.993% 99.991% 99.992%
99.992% 99.991% 99.992% 99.992% 99.992% 99.992% 99.992% 99.991%
99.992% 99.991% 99.992% 99.992% 99.991% 99.992% 99.992% 99.992%
99.992% 99.991% 99.991% 99.992% 99.992% 99.992% 99.992% 99.991%
99.992% 99.991% 99.992% 99.992% 99.991% 99.992% 99.992% 99.992%
99.992% 99.991% 99.991% 99.990% 99.991% 99.992% 99.992% 99.992%
99.992% 99.991%
--- Results after 98 passes ---
Best: 99.993% -- Worst: 99.981% -- Average: 99.991408%
Cumulative Accuracy (not per pass): 99.991
root@43776-BridgePi:~#

RPi 2B+ w/ DIAL:

root@Rosston220:~# dahdi_test -c 100
Opened pseudo dahdi interface, measuring accuracy...
99.999% 99.989% 99.991% 99.980% 99.995% 99.994% 99.996% 99.995%
99.999% 99.986% 99.989% 99.985% 99.993% 99.995% 99.996% 99.995%
99.996% 99.993% 99.997% 99.992% 99.994% 99.981% 99.992% 99.993%
99.997% 99.616% 99.996% 99.615% 99.986% 99.993% 99.626% 99.613%
99.987% 99.992% 99.628% 99.613% 99.997% 99.990% 99.980% 99.997%
99.995% 99.993% 99.993% 99.995% 99.995% 99.995% 99.986% 99.993%
99.992% 99.993% 99.987% 99.625% 99.601% 99.993% 99.995% 99.995%
99.993% 99.985% 99.983% 99.615% 99.600% 99.995% 99.993% 99.615%
99.602% 99.612% 99.991% 99.602% 99.613% 99.603% 99.997% 99.992%
99.994% 99.613% 99.602% 99.612% 99.601% 99.996% 99.996% 99.990%
99.992% 99.981% 99.994% 99.994% 99.996% 99.993% 99.994% 99.999%
99.999% 99.991% 99.988% 99.990% 99.993% 99.989% 99.990% 99.986%
99.993% 99.994%
--- Results after 98 passes ---
Best: 99.999% -- Worst: 99.600% -- Average: 99.914483%
Cummulative Accuracy (not per pass): 99.993
root@Rosston220:~# modprobe dahdi_dummy
root@Rosston220:~# dahdi_test -c 100
Opened pseudo dahdi interface, measuring accuracy...
99.990% 99.979% 99.980% 99.992% 99.991% 99.988% 99.994% 99.995%
99.995% 99.994% 99.994% 99.995% 99.994% 99.996% 99.993% 99.995%
99.995% 99.996% 99.995% 99.988% 99.988% 99.995% 99.994% 99.996%
99.993% 99.994% 99.995% 99.995% 99.996% 99.994% 99.995% 99.995%
99.995% 99.995% 99.993% 99.994% 99.995% 99.998% 99.992% 99.991%
99.988% 99.994% 99.995% 99.996% 99.993% 99.995% 99.995% 99.997%
99.994% 99.987% 99.987% 99.995% 99.994% 99.996% 99.993% 99.994%
99.994% 99.994% 99.997% 99.987% 99.991% 99.991% 99.989% 99.996%
99.993% 99.994% 99.994% 99.995% 99.995% 99.994% 99.995% 99.995%
99.995% 99.995% 99.995% 99.995% 99.995% 99.994% 99.995% 99.995%
99.995% 99.995% 99.995% 99.995% 99.995% 99.995% 99.995% 99.995%
99.995% 99.994% 99.994% 99.994% 99.994% 99.996% 99.993% 99.997%
99.991% 99.990%
--- Results after 98 passes ---
Best: 99.998% -- Worst: 99.979% -- Average: 99.993478%
Cummulative Accuracy (not per pass): 99.994
root@Rosston220:~#


Ken KE2N
 

This (dahdi_dummy) worked well with my RPI3 and it even helped results on a big hulking quad core machine, by raising the occasional worst-case result..

The remaining problem that I see with ASL1.01 is - for lack of a better name - usb fob startup.  When the repeater has been quiet and decides to spit out a morse or voice ID, sometimes the first morse character or the first syllable or two of the voice comes out choppy. 

In the other camp I believe they fixed this problem by running the data stream continuously, is that hard to do?

Ken


Steve N4IRS
 

Ken,
Not sure what you mean by running the data stream continuously. I'm thinking a startup delay may help, but both seem like a hack rather then a fix. What channel driver are you seeing this with?

Steve N4IRS

On 12/30/19 1:43 PM, Ken KE2N via Groups.Io wrote:
This (dahdi_dummy) worked well with my RPI3 and it even helped results on a big hulking quad core machine, by raising the occasional worst-case result..

The remaining problem that I see with ASL1.01 is - for lack of a better name - usb fob startup.  When the repeater has been quiet and decides to spit out a morse or voice ID, sometimes the first morse character or the first syllable or two of the voice comes out choppy. 

In the other camp I believe they fixed this problem by running the data stream continuously, is that hard to do?

Ken


Tim WD6AWP
 

HV did a fix where idle data is set to the URI constantly. You can see this in that the green LED behaves differently in HV nodes vs ASL. David said that helps with delayed audio causing the "hear yourself echo" on repeaters. I’ve never heard that it fixed a stuttering ID on FOB startup. 

A similar symptom is a startup stutter from connected nodes at first transmissions. I’ve always assumed that is the IAX jitter buffers adjusting from the relaxed value (40ms) to something larger as needed. 
--
Tim
:wq

On Dec 30, 2019, at 10:47 AM, Steve N4IRS <szingman@...> wrote:

Ken,
Not sure what you mean by running the data stream continuously. I'm thinking a startup delay may help, but both seem like a hack rather then a fix. What channel driver are you seeing this with?

Steve N4IRS

On 12/30/19 1:43 PM, Ken KE2N via Groups.Io wrote:
This (dahdi_dummy) worked well with my RPI3 and it even helped results on a big hulking quad core machine, by raising the occasional worst-case result..

The remaining problem that I see with ASL1.01 is - for lack of a better name - usb fob startup.  When the repeater has been quiet and decides to spit out a morse or voice ID, sometimes the first morse character or the first syllable or two of the voice comes out choppy. 

In the other camp I believe they fixed this problem by running the data stream continuously, is that hard to do?

Ken




--
Tim
:wq


Ken KE2N
 

Thanks for the insight Tim.
I wonder if there is some sort of "elastic buffer" feeding into the FOB?


Ken KE2N
 

my big linux box 

 Version: Intel(R) Core(TM) i5-4690K CPU @ 3.50GHz
        Voltage: 1.2 V
        External Clock: 100 MHz
        Max Speed: 3800 MHz
        Current Speed: 3500 MHz

root@xlxref:/usr/sbin# sudo dahdi_test -c 100 Opened pseudo dahdi interface, measuring accuracy...

99.997% 99.996% 99.999% 99.998% 99.995% 99.997% 99.999% 99.998% 99.999% 99.997% 99.998% 99.999% 100.000% 99.999% 99.997% 99.999% 99.998% 99.998% 99.998% 99.998% 100.000% 99.998% 99.999% 99.999% 99.996% 99.998% 99.998% 99.999% 99.999% 99.997% 100.000% 99.998% 99.998% 99.999% 99.997% 99.218% 99.216% 99.998% 99.224% 99.999% 99.221% 99.998% 99.220% 99.995% 99.219% 99.999% 99.999% 99.224% 99.218% 99.223% 99.222% 99.999% 99.996% 99.997% 99.999% 99.998% 100.000% 99.995% 99.224% 99.221% 99.999% 99.998% 99.998% 99.999% 99.998% 99.998% 99.999% 99.997% 99.223% 99.222% 99.998% 99.998% 99.999% 100.000% 99.997% 99.998% 99.998% 99.995% 99.224% 99.222% 99.997% 99.998% 99.999% 99.224% 99.221% 99.999% 99.999% 99.999% 99.225% 99.221% 99.998% 99.999% 99.998% 99.224% 99.221% 99.999% 99.998% 99.221%

--- Results after 98 passes ---

Best: 100.000% -- Worst: 99.216% -- Average: 99.815911% Cumulative Accuracy (not per pass): 99.994 root@xlxref:/usr/sbin#

 

 

root@xlxref:/usr/src/asl-dahdi-linux-2.11.1# /usr/sbin/dahdi_test -c 100 Opened pseudo dahdi interface, measuring accuracy...

99.995% 99.996% 99.999% 99.999% 99.997% 99.998% 99.995% 100.000% 99.998% 99.997% 99.997% 99.995% 99.999% 99.999% 99.997% 100.000% 99.999% 99.995% 99.998% 100.000% 99.996% 99.999% 99.995% 99.997% 99.999% 99.998% 99.995% 100.000% 100.000% 100.000% 99.997% 99.995% 100.000% 100.000% 99.997% 100.000% 99.997% 99.997% 99.997% 100.000% 99.998% 99.996% 99.999% 99.999% 100.000% 99.994% 99.998% 99.999% 99.997% 99.997% 99.998% 99.995% 99.999% 99.997% 99.997% 99.998% 99.995% 99.997% 99.998% 99.998% 99.999% 99.995% 99.998% 99.998% 100.000% 99.996% 99.997% 99.997% 99.999% 99.997% 99.998% 99.999% 99.997% 99.998% 100.000% 99.995% 99.999% 99.999% 99.999% 99.997% 99.997% 99.995% 99.997% 99.998% 99.998% 100.000% 99.995% 99.999% 100.000% 100.000% 99.996% 99.999% 99.997% 99.998% 100.000% 99.997% 99.995% 99.998%

--- Results after 98 passes ---

Best: 100.000% -- Worst: 99.994% -- Average: 99.997719% Cumulative Accuracy (not per pass): 99.999





Steve N4IRS
 
Edited

I have posted a updated version of DAHDI source. It will build on the toolchain shipped with Raspbian Buster. I still need to test it with other architectures.
I can build a DKMS with this also so I will be replacing the apt package. More testing to do.
Repo is at https://github.com/DVSwitch/asl-dahdi-linux

Build on Stretch i386
Build on Jessie x64

Steve N4IRS