Bitmain hardware is awful. IMHO the last good hardware they made were the S1s. Everything from there has gone downhill.
As others have correctly stated, p2pool "restarts" the work a lot more often than "conventional" pools. In layman's terms, the conversation between your miner and p2pool goes something like this:
p2pool: here is some work, stop everything you are doing and start working on this
miner: got it, I'll start working on it as soon as possible
(avg 30 seconds later): p2pool: here is some work, stop everything you are doing and start working on this
miner: got it, I'll start working on it as soon as possible
and so forth. That "stop everything you're doing" part is what Bitmain hardware sucks at doing. Spondoolie hardware seems to manage it just fine. As always, YMMV. Some folks have luck tweaking their S2/S3/S4/S5/Swhatever, sometimes regularly. I never had any luck with it, and have long since given up on Bitmain junk hardware.
For comparison, conventional pools look like this:
pool: here is some work, switch when you can, I'll continue accepting your prior work for a while
miner: got it, I'll start working on it as soon as possible
pool: here is some work, switch when you can, I'll continue accepting your prior work for a while
miner: got it, I'll start working on it as soon as possible
pool (approx ~10 mins): here is some work, stop everything you are doing and start working on this
M
You got it. The reason is because of the share-chain shares in p2pool. Approximately every 30 seconds (averaged, it could be 1 second, it could be 100), a new share is added to the share chain. P2Pool broadcasts the "stop everything" message every time this happens. In a traditional pool, that "stop everything" message only comes once a block is found. Traditional pools will broadcast new work, i.e. they've just done a GBT call and created a new chunk of work for miners, but they don't force a restart, they'll still accept the old work from the miner.
Edit:
The only cases where p2pool behaves differently is when a miner submits a share that solves a block of BTC. A dead share is work that a miner was doing on a previous set of work after the node has accepted a newer share on the chain. If that share solves a block, it gets submitted and if accepted, miners are paid based on the information in that share.
This is also why sometimes you'll see a p2pool mining transaction in your wallet, but your node UI doesn't show the block. Since that share never made it onto the share chain, the UI doesn't see it.