The big challenge is storage. If you don't treat storage as a first class service and instead make it part of the standard 'atom' your storage requirements grow faster than your compute requirements. And while you get some relief by replacing the storage component with denser ones, you always seem to end up with high priced and under employed compute capabilities going to waste while it provides access to data on some spinning rust.
I was an advocate of variation in the form of 'storage focused' and 'compute focused' atoms but at the time the mantra was 'identical blocks.' Never got much traction on that. The trick is of course mixing nodes the the mesh of services, that aspect of it really benefits from a colloidal solution of resource nodes :-)