EDCD / EDDI

Companion application for Elite Dangerous
Other
444 stars 81 forks source link

Disk access spikes when EDDI running through VoiceAttack #407

Closed Taomyn closed 6 years ago

Taomyn commented 6 years ago

EDDI version in which issue found

[3.0.0-b1]

Steps to reproduce

  1. [Start VoiceAttack with any profile, even empty]
  2. [VoiceAttack process spikes constant disk access to EDDI.sqlite]
  3. [Start just EDDI, no constant access]

Expected

[Normal disk access]

Observed

[35% constant disk access of VoiceAttack.exe to EDDI.sqlite]

Investigation

eddi_issue.zip

Tkael commented 6 years ago

When EDDI first starts, if you have enabled the connection to EDSM, it syncs flight logs with EDSM. If it has been some time since the last sync, this process may take some time to complete.

Taomyn commented 6 years ago

I was playing E:D last night, I only noticed it today when I was starting everything up before running E:D - which I can't do now that my Oculus won't run :-(

I've left it running for 30min and it was still doing the same - even EDDiscovery doesn't take that long.

Tkael commented 6 years ago

I'm guessing that EDDI was able to complete most (or all) of the sync through the VoiceAttack instance before you closed VoiceAttack and opened EDDI as a standalone application.

Tkael commented 6 years ago

This process is necessary to sync your travel log, system comments, etc.

Taomyn commented 6 years ago

For over 30min without finishing (had to close VoiceAttack) and only when I run it through VoiceAttack?

I'll start VA and wait again, seeing as I can't play E:D anyway......

Taomyn commented 6 years ago

I've been waiting again and went to look at the log file, I think there's a problem as this is all it is logging now:

2018-03-07T18:57:19 VoiceAttackPlugin:setStatus [W] EDDI exception: System.InvalidOperationException: Sequence contains no elements at System.Linq.Enumerable.Aggregate[TSource](IEnumerable1 source, Func3 func) at EddiSpeechService.Translations.ICAO(String callsign, Boolean passDash) at EddiVoiceAttackResponder.VoiceAttackPlugin.setShipValues(Ship ship, String prefix, Object& vaProxy) 2018-03-07T18:57:19 VoiceAttackPlugin:setStatus [W] EDDI exception: System.InvalidOperationException: Sequence contains no elements at System.Linq.Enumerable.Aggregate[TSource](IEnumerable1 source, Func3 func) at EddiSpeechService.Translations.ICAO(String callsign, Boolean passDash) at EddiVoiceAttackResponder.VoiceAttackPlugin.setShipValues(Ship ship, String prefix, Object& vaProxy) 2018-03-07T18:57:19 VoiceAttackPlugin:setStatus [W] EDDI exception: System.InvalidOperationException: Sequence contains no elements at System.Linq.Enumerable.Aggregate[TSource](IEnumerable1 source, Func3 func) at EddiSpeechService.Translations.ICAO(String callsign, Boolean passDash) at EddiVoiceAttackResponder.VoiceAttackPlugin.setShipValues(Ship ship, String prefix, Object& vaProxy) 2018-03-07T18:57:20 VoiceAttackPlugin:setStatus [W] EDDI exception: System.InvalidOperationException: Sequence contains no elements at System.Linq.Enumerable.Aggregate[TSource](IEnumerable1 source, Func3 func) at EddiSpeechService.Translations.ICAO(String callsign, Boolean passDash) at EddiVoiceAttackResponder.VoiceAttackPlugin.setShipValues(Ship ship, String prefix, Object& vaProxy) 2018-03-07T18:57:20 VoiceAttackPlugin:setStatus [W] EDDI exception: System.InvalidOperationException: Sequence contains no elements at System.Linq.Enumerable.Aggregate[TSource](IEnumerable1 source, Func3 func) at EddiSpeechService.Translations.ICAO(String callsign, Boolean passDash) at EddiVoiceAttackResponder.VoiceAttackPlugin.setShipValues(Ship ship, String prefix, Object& vaProxy) 2018-03-07T18:57:21 VoiceAttackPlugin:setStatus [W] EDDI exception: System.InvalidOperationException: Sequence contains no elements at System.Linq.Enumerable.Aggregate[TSource](IEnumerable1 source, Func3 func) at EddiSpeechService.Translations.ICAO(String callsign, Boolean passDash) at EddiVoiceAttackResponder.VoiceAttackPlugin.setShipValues(Ship ship, String prefix, Object& vaProxy) 2018-03-07T18:57:21 VoiceAttackPlugin:setStatus [W] EDDI exception: System.InvalidOperationException: Sequence contains no elements at System.Linq.Enumerable.Aggregate[TSource](IEnumerable1 source, Func3 func) at EddiSpeechService.Translations.ICAO(String callsign, Boolean passDash) at EddiVoiceAttackResponder.VoiceAttackPlugin.setShipValues(Ship ship, String prefix, Object& vaProxy)

Tkael commented 6 years ago

I was finally able to review your log this evening. Neither component of EDDI that heavily relies on the sql database (EDSM and Galnet) is enabled on your configuration. It looks like you are not configured to use EDSM at all so the sync I mentioned wouldn't be applicable / performed on your PC. The only sql database entries occurred when EDDI needed to record systems that you actually visited. All in all, sql access should have been very light for you. I don't see anything in this log that would suggest a spike in cpu cycles due to sql access.

How were you observing the cpu spikes and linking them to EDDI.sqlite? I'm at a loss for how sqlite could be causing the spike you're reporting.

Version 3.0.0-b1 does implement a new Status monitor. We've identified some errors and have toned down the update frequency for that new monitor in the next update. Please try the next beta version when that becomes available and compare?

Taomyn commented 6 years ago

It's not CPU spikes, it's constant disk access. After VA starts and everything is loaded (empty profile to eliminate any thing a profile could be doing), I see the hard disk light flashing constantly. I then start the Windows resource monitor, look at the Disk tab and can see VoiceAttack.exe accessing EDDI.sqlite constantly at over 2million Bytes/sec both read and write. It's not 100%'ing the disk but even 35% constantly is not a good sign. The access seems to match the repeated logging of the exception messages I pasted above, which you haven't mentioned.

I can't attach a screen shot as I'm not at home but can do so later to show the information, and will try the next beta once released of course.

Tkael commented 6 years ago

I haven't been able to replicate this exception yet. The exception does seem to mention the status monitor, which as I said we'll be significantly revising for the next beta.

Tkael commented 6 years ago

I just remembered... SetStatus is a pre-existing function that existed before the status monitor. Can I suggest that your ship monitor config file may be corrupt?

Try navigating to %appdata%/EDDI and deleting shipmonitor.json while completely exited out of VoiceAttack and EDDI. Then relaunch EDDI and let EDDI regenerate the file. After doing this, does the issue recur?

firdimigdi commented 6 years ago

Not sure how sqlite handles the journal but whenever this spike on load occurs the EDDI.sqlite-journal file is created and deleted multiple times (I assume due to DB transactions?) which adds to the spike.

Taomyn commented 6 years ago

I deleted the shipmonitor.json file, it was recreated but the issue persists. As @moreyummystuff states above the journal file is constantly recreated.

clipboard01

Tkael commented 6 years ago

Do you have EDSM credentials recorded in EDDI?

Tkael commented 6 years ago

Is the exception still appearing in the log? I think the exception you're seeing might have been a separate issue with your shipmonitor.json (and may have been fixed by deleting shipmonitor.json)?

I've revised the code so that we need to write much less to the database when EDDI loads, and to batch database writes to further reduce disk usage. I think you'll see a pretty dramatic difference in the next update. :-)