Subdivision failed on boolean-subtracted object
It is not always efficient to use boolean tool when you are using subdivision. Subdivision demands good topology especially on curved even surfaces and boolean often needs cleanup afterwards. This is how I do it.

Enable the LoopTools add-on. 

Create a cylinder with sufficient amount of faces to hold your holes without deforming too much. Divide your cylinder so that faces are square and even.

Select at least a square of four faces (2x2, 3x3 etc).

Run Specials menu (w), LoopTools, Circle. This will make the circles perimeter to be arranged in a circle. Make sure to uncheck the "flatten" option (you will want the circle to be curved on the surface).

Inset the selection a tiny bit to create a support loop around the hole and then delete the inner faces.

Add a solidify and a subdivision modifier and configure then to your needs.

Add other needed support loops and delete unneeded loops. If you need you could apply the solidify modifier and add extra support loops on the rim.