Hallo hexa,
das sieht schonmal viel besser aus, und reicht erstmal als vorläufiger Fix:
Version avg max von - bis
1.2.6 (beta) 0.29 1.08 23.-26.11.
1.3.1 (testing) 0.74 2.58 26.-27.11.
1.3.1, ra_holdoff=30 0.26 1.25 27.-29.11.
Link zum Graphen
Die Mehrfachaufrufe sind immer noch da (aber die gab’s auch schon bei 1.2.6):
-----------------------------------------------------
OpenWrt 18.06-SNAPSHOT, r7391+11-0d549271d3
-----------------------------------------------------
root@64287-tuccity:~# while [ 1 ]; do l=`ps|grep "br-client ra-updated" |grep -v grep`; [ -n "$l" ] && (date; echo "$l") ; sleep 1 ;done > /tmp/ps_raupdated.log
^C
root@64287-tuccity:~# cat /tmp/ps_raupdated.log
Fri Nov 30 01:36:14 CET 2018
25973 root 1340 R /bin/sh /lib/netifd/dhcpv6.script br-client ra-updated
25974 root 1340 R /bin/sh /lib/netifd/dhcpv6.script br-client ra-updated
25975 root 1340 R /bin/sh /lib/netifd/dhcpv6.script br-client ra-updated
25977 root 1340 R /bin/sh /lib/netifd/dhcpv6.script br-client ra-updated
25978 root 1340 R /bin/sh /lib/netifd/dhcpv6.script br-client ra-updated
Fri Nov 30 01:36:15 CET 2018
25977 root 1340 S /bin/sh /lib/netifd/dhcpv6.script br-client ra-updated
25978 root 1340 S /bin/sh /lib/netifd/dhcpv6.script br-client ra-updated
Fri Nov 30 01:36:51 CET 2018
26213 root 1340 R /bin/sh /lib/netifd/dhcpv6.script br-client ra-updated
26214 root 1340 R /bin/sh /lib/netifd/dhcpv6.script br-client ra-updated
26215 root 1340 R /bin/sh /lib/netifd/dhcpv6.script br-client ra-updated
26216 root 1340 R /bin/sh /lib/netifd/dhcpv6.script br-client ra-updated
26217 root 1340 R /bin/sh /lib/netifd/dhcpv6.script br-client ra-updated
Fri Nov 30 01:36:52 CET 2018
26211 root 1340 R /bin/sh /lib/netifd/dhcpv6.script br-client ra-updated
26213 root 1340 S /bin/sh /lib/netifd/dhcpv6.script br-client ra-updated
26214 root 1340 S /bin/sh /lib/netifd/dhcpv6.script br-client ra-updated
26215 root 1340 S /bin/sh /lib/netifd/dhcpv6.script br-client ra-updated
26216 root 1340 S /bin/sh /lib/netifd/dhcpv6.script br-client ra-updated
26217 root 1340 S /bin/sh /lib/netifd/dhcpv6.script br-client ra-updated
Fri Nov 30 01:37:27 CET 2018
[5 Zeilen]
Fri Nov 30 01:37:28 CET 2018
[6 Zeilen]
Fri Nov 30 01:38:08 CET 2018
[6 Zeilen]
Fri Nov 30 01:38:09 CET 2018
[7 Zeilen]
...usw.
In script_call() ist wohl der Wurm drin…
-
Zeile 400:
- if (diff > delay)
+ if (diff < delay)
, sonst ist delay immer <= 0, und der Child-Prozess rennt durch, ohne zu warten. -
Zeile 398, kill() fork() usw.
Das laufende Skript zu killen und neu zu forken verbrennt IMHO unnötig Rechenzeit. Das Problem ist wohl, dass die DHCP-Einträge nur im Parent-Prozess aktualisiert werden, und die Einträge des Childs während dessleep(delay)veralten.
Evtl. könnte man aufsleep()verzichten, und statt dessen z.B. mitwaitpid(.. WNOHANG ..)testen, ob das Skript noch läuft. Fallsnein && (now - last_update >= delay): neu forken.
Trade-off: ein Update während des Delays wird nicht (gleich) umgesetzt. -
Anscheinend will man für RA-Updates ein delay von mind. 1 Sekunde (
script_accu_delay = 1). Das kann aber schiefgehen, weil mit ganzen Sekunden gerechnet wird.
(4.) 1.-3. erklären wahrscheinlich noch nicht, warum es überhaupt zu mehreren gleichzeitigen(?) Updates kommt. (Soll/muss das so sein?)
Edit: Mein Vorschlag zu 2. taugt nichts. Bin davon ausgegangen, dass nach ein paar Sekunden sowieso das nächste Update kommt, aber es gibt ja auch andere Setups.
Wenn eine hohe Update-Frequenz die Regel und nicht die Ausnahme ist, ist die jetzige Methode sehr ineffizient.
