If you expand the ‘scene’ option in your screenshot does that give you any idea what the expensive part is?
You can find out about GPU profiling here: GPU Profiling | Unreal Engine Documentation
And CPU Profiling: CPU Profiling | Unreal Engine Documentation
With regards to the the materials: Open up your static mesh and look at how many material slots are used. If it’s more than one slot then this might be causing problems with instancing. Probably the easiset way to see how effective instancing is being is to enter ‘stat scenerender’ in the console (whilst playing the game), then look at the number of mesh draw calls. If this is a very high number (as in around the same as the number of blocks or higher) then instancing isn’t working. If it’s a small number then you’re probably OK.
Also, look in your materials and check what the number of instructions is (Look in the ‘Stats’ panel). If this is unusually high then you might want to look at decreasing the complxity of your materials.
One of the problems with instancing is that if you draw one member of the instanced group, you draw all members. This means that if you have a dirt block burried underground where you can’t see it, you might still be drawing it and calculating lighting.
Another useful command is to enter ‘freezerender’ into the console (whilst playing). This will prevent the render loop from updating so you can fly around and check if occlusion etc is working correctly. In your case you probably will be drawing a lot of blocks that aren’t necessarily visible (due to instancing) but it’s worth looking at the results.
Also look at the new render pipeline in 4.22. This will effectivly manage instancing for you at runtime. I don’t think it’ll be as efficient as manual groups but in your case where you have a lot of instanced objects, the majoirty of which should be occluded, it might work better. You will need take all of your objects out of instance groups for it work.