Circuit logic controls the cracking. I use heavy if heavy > 2k, light if light > PG. This ensures a buffer of heavy for lubricant, and that light is not cracked until needed.
Ignoring edge effects, the ideal ratio of refinery : heavy : light should be 1 : 0.35 : 2.048, or about 3 : 1 : 6. This will produce 22.4 PG/s from 19.2 crude/s (31% gain from productivity).
You can easily expand each row up. To switch cracking from light to heavy, adjust the underground pipe to connect to the heavy pipe. You can also copy a whole 1:6 block.
If you consume lubricant, you can probably get rid of the bottom beacon.
You can later add solid/rocket fuel processing, probably process all light available and process PG if >2k or something like that.
Of course, once you add fuel processing the ideal ratio will be determined by your consumption ratio of gas:fuel.
blueprint
Update: this is the setup I use for making rocket fuel. I use power switches to switch light/gas -> rocket fuel so beacons are also switched off when not processing. My current rules are light -> fuel always as long as light >0; and gas -> fuel only if gas > light. This ensures that gas is first used for plastic/sulphur if needed. Each chemplant has 6 speed beacons, giving it total output of speed*productivity=4.625*1.2=5.55, which nicely matches the speed of the assemblers with 8 beacons and 4 prod3 modules (5.5).
In total, each assembler outputs 5.5*1.4/30=0.256 rocket fuel per second, consuming 5.5/(3*1.2)=1.53 light or 3.06 gas per second.
A refinery with 5xsp3+2xprod3 produces (4.5/5) * 3.2*1.2=3.46 light plus (1/5)*3.2*1.2=.77 heavy which is converted into .77*.75*1.2=0.69 light, so in total 4.15 light per second, so you need 2.7 light oil -> rocket fuel assemblers per refinery.
If you are not consuming gas at all, each refinery produces (5.5/5) * 3.2 * 1.2=4.22 gas, so you need 1.38 gas->fuel assemblers per refinery.
blueprint