I forum di Maker hanno una vasta base di utenti, ma raramente hanno abbastanza utenti contemporaneamente online da collassare la visualizzazione degli avatar di Chi è Online. Abbiamo scoperto che il plugin Who’s Online era responsabile di prestazioni lente, fino al punto di causare il timeout delle richieste, anche con solo un paio di utenti online. Utilizziamo una configurazione nginx esterna con una pagina offline e, a causa di questi timeout, venivamo periodicamente visualizzati la pagina di manutenzione anche quando non era in corso alcuna manutenzione.
Serviamo le immagini localmente dopo aver migrato da Digital Ocean Spaces, il che crea competizione per i worker Unicorn. Tuttavia, stiamo eseguendo tutto su una VM con 2 CPU e 4 GB di RAM, e abbiamo un database relativamente grande (circa 400K post, database da 6 GB), quindi non abbiamo spazio per aggiungere semplicemente molti altri worker Unicorn da mezzo gigabyte ciascuno. Sospetto che se utilizzassimo l’archiviazione a oggetti per le immagini, l’impatto complessivo sarebbe minore grazie a una minore competizione per i worker Unicorn, ma non ci vorrebbe molto perché rimanesse comunque significativo, dato che abbiamo osservato questo impatto attualmente anche con solo due utenti online.
Aggiornamento: Modificando la zona di limitazione della frequenza flood da 12r/s a 36r/s e burst da 12 a 36, abbiamo almeno ridotto l’impatto di Who’s Online. Stiamo testando questa configurazione.
Ulteriore aggiornamento: con il triplicato tasso di flood, non abbiamo ricevuto segnalazioni di problemi.
Sto utilizzando nginx esterno e ho applicato il limitatore di frequenza a nginx esterno, utilizzando il template ratelimited come punto di partenza, ma sto utilizzando il limitatore di frequenza in nginx interno, perché nginx esterno non conosce quali route sono statiche e quindi applica il limitatore di frequenza sia alle route statiche che a quelle dinamiche, il che, quando l’ho fatto, ha causato molti fallimenti/ripetizioni nel caricamento delle risorse statiche. Si noti che questo è un motivo per eseguire nginx esterno; altrimenti, penso che tutto il traffico IPv6 venga attribuito all’indirizzo IP di Docker e venga limitato in frequenza come se fosse un unico indirizzo IP.