O que está acontecendo é que Chart.js multiplica o tamanho da tela quando é chamado, em seguida, tenta redimensioná-la usando CSS, com o objetivo de fornecer gráficos de resolução mais alta para dispositivos de alto dpi.
O problema é que ele não percebe que já fez isso, então quando chamado de vezes sucessivas, ele multiplica o tamanho já (dobrado ou qualquer outra coisa) DE NOVO até que as coisas comecem a quebrar. (O que realmente está acontecendo é verificar se deve adicionar mais pixels à tela, alterando o atributo DOM para largura e altura, se necessário, multiplicando por algum fator, geralmente 2, em seguida, alterando isso e, em seguida, alterando o estilo css atributo para manter o mesmo tamanho na página.)
Por exemplo, quando você o executa uma vez e a largura e altura da tela são definidas como 300, ele as define como 600 e, em seguida, altera o atributo de estilo para 300 ... mas se você executá-lo novamente, ele vê que a largura e a altura do DOM são 600 (verifique a outra resposta a esta pergunta para ver o porquê) e, em seguida, defina como 1200 e a largura e altura do css como 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 Chart.js
var ctx = document.getElementById("canvas").getContext("2d");
ctx.canvas.width = 300;
ctx.canvas.height = 300;
var myDoughnut = new Chart(ctx).Doughnut(doughnutData);