Armadilloフォーラム

時間の取得(gettimeofday)

sakashita_spc

2019年4月20日 15時18分

お世話になります。
今、Armadillo-840で、時間制御を行っており、ログの生成等にgettimeofdayを利用して、時間の出力を行っております。
実行を行う上で、ログの時間が逆転するケースがあり、利用方法の問題等がないか確認したいと考えております。

10秒おこのログに対して、以下のようなログを出しております。
A)[2019/04/20][15:01:30.420][18403] diff=10.000000 1555740090.000000 1555740080.000000
B)[2019/04/20][15:01:40.464][18403] diff=10.000000 1555740100.000000 1555740090.000000
C)[2019/04/20][15:01:23.973][18403] diff=-17.000000 1555740083.000000 1555740100.000000
D)[2019/04/20][15:01:34.149][18403] diff=11.000000 1555740094.000000 1555740083.000000
内容は、左から、ログの時間(日時),(pid) diff=時間の差分、現行のgettimeofdayからのtv_secの値、前回のtv_secの値
の表示を行っており、
AからDまでのログで、Cでのgettimeofdayのtv_secの値が問題になっております。

特にgettimeofday()を正しく利用するうえで、何か初期化関数等必要でしょうか?

コードは
double get_sec(void)
{
struct timeval t1;
gettimeofday(&t1,NULL);
return (double)t1.tv_sec;
}
のような感じで利用しています。
左端の時間はlocaltime()を利用しています。

また、gettimeofday()のusecを利用して、100msecの間隔の精度を上げたいと考えておるのですが、この現象で
評価が進んでおりません。
他に100msecの間隔を測定するAPI等があれば紹介いただければ助かります。

もし何かわかればアドバイスお願いします。

以上、よろしくお願いします。


コメント

sakashita_spc

2019年4月22日 0時07分

gettimeofday()の代わりに、以下の方法も可能様なようです。

struct timespec ts;
clock_gettime(CLOCK_REALTIME,&ts);

どちらの方法も、同等の精度なのでしょうか?また、サイトによってはclock_gettime()を推奨されている
ような記述もあるようですが、armadilloではどちらのAPIを推奨でしょうか?

少し評価をして、問題がないか確認したいと思います。

よろしくお願いします。

at_makoto.sato

2019年4月22日 10時53分

システム時刻を取得しているためNTPの自動補正の影響を受けて時間が戻ってしまっているように見えます。

> gettimeofday()の代わりに、以下の方法も可能様なようです。
>
>
> struct timespec ts;
> clock_gettime(CLOCK_REALTIME,&ts);
>


clock_gettime(CLOCK_MONOTONIC, &ts); <- NTPの影響を少なくできます。

または

clock_gettime(CLOCK_MONOTONIC_RAW, &ts); <- NTPの影響を受けません。

で、経過時刻を取得することができます。

詳細はman pageで確認できます。
man 2 clock_gettime

sakashita_spc

2019年4月22日 16時34分

>clock_gettime(CLOCK_MONOTONIC_RAW, &ts); <- NTPの影響を受けません。
>で、経過時刻を取得することができます。

情報ありがとうございます。
確認してみます。

>システム時刻を取得しているためNTPの自動補正の影響を受けて時間が戻ってしまっているように見えます。
Q1-1) これは、clock_gettime(CLOCK_REALTIME)でも同じでしょうか?

また、CLOCK_MONOTONIC_RAWでは時間間隔の評価で利用可能なので、100msec間隔の評価で利用したと思います。
Q1-2)現在の環境ではNTPの設定はまったくしていません。それでも、影響が受けるのでしょうか?

Q2)gettimeofday()やclcok_gettime(CLOCK_REALTIME)が正確な時間取得(日時)ができないとなると、どうすればいいでしょうか?

以上、3点(Q1-1/2,Q2)よろしくお願いします。

at_makoto.sato

2019年4月22日 17時39分

佐藤です。

> >システム時刻を取得しているためNTPの自動補正の影響を受けて時間が戻ってしまっているように見えます。
> Q1-1) これは、clock_gettime(CLOCK_REALTIME)でも同じでしょうか?
はい、同じです。

> Q1-2)現在の環境ではNTPの設定はまったくしていません。それでも、影響が受けるのでしょうか?
settimeofday() や date コマンドによってシステム時刻が設定された場合も影響します。

> Q2)gettimeofday()やclcok_gettime(CLOCK_REALTIME)が正確な時間取得(日時)ができないとなると、どうすればいいでしょうか?
時間が戻ってしまう原因を特定し、その原因を排除した上で、gettimeofday() や clock_gettime(CLOCK_REALTIME) を使用するしかないように思われます。

sakashita_spc

2019年4月23日 12時07分

佐藤様
お世話になります。

clock_getttime(CLOCK_REALTIME)およびgettimeofday()の時刻が戻ってしまう現象としては、意図的settimeofday(),dateによって変更しない限りないと考えていいでしょうか?現在、840のデフォルトの環境でアプリを動かしています。メモリーの関係上若干動作アプリは減らしてはいます。
自社のアプリでは一回のみsettimeofday()でサーバー(NTPではない)から取得した時間を設定しており、それ以降の変更はしていないのですが、
840の標準のアプリで時間を調整するようなアプリケーションは存在しますでしょうか?
以下のようなアプリが動作しています。
[root@armadillo840-0 (pts/0) /mnt/log]# ps
PID USER TIME COMMAND
1 root 0:03 init
2 root 0:00 [kthreadd]
3 root 3:38 [ksoftirqd/0]
5 root 0:00 [kworker/u:0]
6 root 0:00 [cpuset]
7 root 0:00 [khelper]
8 root 0:00 [kdevtmpfs]
9 root 0:00 [netns]
10 root 0:00 [kworker/u:1]
290 root 0:00 [sync_supers]
292 root 0:00 [bdi-default]
293 root 0:00 [kintegrityd]
295 root 0:00 [kblockd]
310 root 0:00 [khubd]
411 root 0:00 [rpciod]
421 root 0:00 [kswapd0]
422 root 0:00 [fsnotify_mark]
423 root 0:00 [nfsiod]
974 root 0:00 [pvr_timer]
1042 root 0:00 [mtdblock0]
1047 root 0:00 [mtdblock1]
1052 root 0:00 [mtdblock2]
1057 root 0:00 [mtdblock3]
1062 root 0:00 [mtdblock4]
1067 root 0:00 [mtdblock5]
1114 root 0:00 [irq/11-rtc-s353]
1130 root 0:00 [wdt_thread]
1134 root 0:00 [tmio_mmc]
1160 root 0:00 [deferwq]
1174 root 0:00 [mmcqd/0]
1363 root 0:01 udevd --daemon
1406 root 0:00 syslogd -L
1505 root 0:00 klogd
2856 root 0:00 [pvr_workqueue]
3391 root 0:00 inetd
3417 avahi 0:00 avahi-daemon: running [armadillo840-0.local]
3418 avahi 0:00 avahi-daemon: chroot helper process
3429 root 0:00 httpd -h /home/www-data
3441 root 0:00 /sbin/sshd -f /etc/ssh/sshd_config
3502 guest 0:00 -ash
3503 root 0:00 /bin/sh /mnt/data/app ★
3505 root 305:45 /mnt/data/app_app ★
3538 root 0:00 [flush-179:0]
3614 root 0:00 ash
5560 root 0:03 {sshd} sshd: root@pts/0
6812 root 0:00 -ash
8679 root 3:43 /mnt/data/board -f /mnt/data/setup ★
9598 root 0:01 [kworker/0:0]
19198 root 0:01 [kworker/0:1]
21018 root 0:01 [kworker/0:2]
22412 root 0:00 [flush-1:0]
32226 root 0:00 ps
32227 root 0:00 sh -c /mnt/data/cmd 1 2 ★
★がこちらで導入したアプリです。

可能性としては、avahiかssh関係でしょうか?
もしわかれば、アドバイスお願いします。

以上、よろしくお願いします。

at_makoto.sato

2019年4月23日 14時16分

佐藤です。

> clock_getttime(CLOCK_REALTIME)およびgettimeofday()の時刻が戻ってしまう現象としては、意図的settimeofday(),dateによって変更しない限りないと考えていいでしょうか?
他には stime()、clock_settime() などがあります。

> 840の標準のアプリで時間を調整するようなアプリケーションは存在しますでしょうか?
そのようなアプリケーションは存在してないように見えます。

sakashita_spc

2019年4月26日 23時32分

佐藤様
連絡遅くなりました。

ユーザーアプリに何か存在していないか確認してみます。
ありがとうございました。