The missed schedule is due to wordpress timeout in the cron process.
Go to wp-include/cron.php, around line no 248, change the value of 0.01 to a larger number.
in my case, I changed from :
wp_remote_post( $cron_url, array( 'timeout' => 0.01, 'blocking' => false, 'sslverify' => apply_filters( 'https_local_ssl_verify', true ) ) );
to
wp_remote_post( $cron_url, array( 'timeout' => 7, 'blocking' => false, 'sslverify' => apply_filters( 'https_local_ssl_verify', true ) ) );
remember this cron.php is a wordpress core file, it will get overwritten when you update your wordpress core. So after every update, remember to change the value again.
If this doesn't work for you, make sure your timezone setting is set correctly. The setting can be found at:
Settings > General