After having a lot of problems with syncing myself, I looked into how to get an ETA of the sync process.
Seems Geth can run a javascript file as part of it's startup in the console, so I added to a script found here and came up with the script below. This needs to be saved into a .js file and referenced at geth startup.
To get it running, add the argument --preload sync_stats.js to your geth startup. This will load the script and start it along with the console, so it gets interleaved with the normal console output. By default, it inserts stats every 10 seconds. Change timeInterval to alter this.
eg.
/home/$USER/go-ethereum/build/bin/geth --rpc console --preload sync_stats.js
Here is the script to go into sync_stats.js:
var lastBlocksToGo = 0;var timeInterval = 10000;var blocksSoFar = 0;var timeSoFar = 0;
setInterval(function(){
if (eth.syncing === false && eth.blockNumber != 0) {
console.log('In Sync. Current Block: '+eth.blockNumber);
lastBlocksToGo = 0;
blocksSoFar = 0;
timeSoFar = 0;
}
else {
var percentage = (eth.syncing.currentBlock/eth.syncing.highestBlock)*100;
percentage = Math.floor(percentage *100) / 100;
var blocksToGo = eth.syncing.highestBlock - eth.syncing.currentBlock;
var blocksThisTime = (lastBlocksToGo - blocksToGo);
if (blocksThisTime > 0) blocksSoFar += blocksThisTime;
timeSoFar += timeInterval;
var bps = blocksSoFar / (timeSoFar / 1000);
var etas = blocksToGo / bps;
var etaM = parseInt(etas/60,10);
var runtM = parseInt(timeSoFar/60000, 10);
if (isNaN(etaM)) etaM = '???';
console.log('Syncing: '+percentage.toFixed(2)+'% ETA: '+etaM+' minutes @ '+bps.toFixed(1)+' blocks/sec [runtime: '+runtM+' mins blocksThisRun: '+blocksSoFar+']');
lastBlocksToGo = blocksToGo;
console.log('Eth.Syncing.CurrentBlock: '+eth.syncing.currentBlock);
console.log('Eth.Syncing.HighestBlock: '+eth.syncing.highestBlock);
}
},timeInterval);