O que está acontecendo é o Chart.js multiplica o tamanho da tela quando é chamado, tenta diminuí-lo usando CSS, o objetivo sendo fornecer gráficos de maior resolução para dispositivos de alto DPI.
O problema é que não percebe que já fez isso; portanto, quando chamado de tempos sucessivos, ele multiplica o tamanho já (dobrado ou o que for) até que as coisas comecem a quebrar. (O que realmente está acontecendo é que é verificar se deve adicionar mais pixels à tela alterando o atributo DOM para largura e altura, se deve, multiplicando -o por algum fator, geralmente 2, depois alterando isso e depois alterando o estilo CSS atributo para manter o mesmo tamanho na página.)
Por exemplo, quando você o executa uma vez e sua largura e altura de tela são definidas como 300, ele as define para 600 e muda o atributo de estilo para 300 ... mas se você o executar novamente, vê que a largura e a altura do DOM são 600 (verifique a outra resposta para esta pergunta para ver o porquê) e depois a define para 1200 e a largura e a altura do CSS para 600.
Não é a solução mais elegante, mas resolvi esse problema, mantendo a resolução aprimorada para dispositivos retina simplesmente definindo a largura e a altura da tela manualmente antes de cada chamada sucessiva para o Chart.js
var ctx = document.getElementById("canvas").getContext("2d");
ctx.canvas.width = 300;
ctx.canvas.height = 300;
var myDoughnut = new Chart(ctx).Doughnut(doughnutData);