It sounds to me like your MySQL is probably reaching it's I/O limits. We did a stress test on our DB server and something that's critical to understanding DB choke points is that when you add or change records, you have to do a disk write (SELECT can be cached). So when we were just reading our website it handled quite a load, but when we simulated a checkout (multiple records created) it bogged down very quickly.
Back then, we didn't have any options. SSDs were too expensive to provision vs magnetic (and our choke number was way beyond anything we've ever really hit). Best we could do was RAID 10. But, thanks to clouds, you can now easily (and cheaply) have a fairly powerful DB server that will handle the I/O loads much better (especially with SSD prices dropping rapidly). You'll note that Amazon sells even their middle instances on the Provisioned IOPS feature
For any production application that requires fast and consistent I/O performance, we recommend Provisioned IOPS (input/output operations per second) storage. Provisioned IOPS storage is a storage type that delivers fast, predictable, and consistent throughput performance. When you create a DB instance, you specify an IOPS rate and storage space allocation. Amazon RDS provisions that IOPS rate and storage for the lifetime of the DB instance or until you change it. Provisioned IOPS storage is optimized for I/O intensive, online transaction processing (OLTP) workloads that have consistent performance requirements.
It sounds very much like you probably have a simple setup (and maybe even host your DB on the same server). AWS isn't the only game in town but you might want to consider moving to some sort of cloud, or at least step up to something that can handle the higher I/O demands you're putting on your server. Forget the number of cores. If your HDD is choking you could be running 72 cores and not have any difference whatsoever.
One other tip: Check out MySQL Tuner. When you run it, it checks your database stats (the longer it's been running, the better) and can recommend lots of helpful tweaks that can also improve performance.
innodb_buffer_pool_size. It's default value is 8MB. You want that variable very high, up to 80-90% of your RAM.innodb_buffer_pool_sizeis a number that says how much RAM MySQL is allowed to allocate for whatever purpose. Usually, MySQL keeps the working data set there. It means it's going to pull the data from RAM rather than HDD. With 128MB you can't do much. You want your entire data set to fit into RAM. It's not a problem to crunch the data, the problem is getting data fast enough to the CPU. Transferring it from HDD to CPU is, well, slow :)