Due to the way CRUSH places PGs on each OSD, there will never be a perfect balance of PGs per OSD. The following query will create a graph that will show the ten most deviant OSDs, so you can see if PG balancing would be beneficial. We have the following code:
mostDeviant(10,collectd.osd*.df.var-lib-ceph-osd-ceph- *.df_complex.used)