MySQL dynamic max_connections setting
<p>Put the following script in a .sh file, for example in <code>/root/watch-mysql.sh</code></p><div class=highlight><pre tabindex=0 style=color:#d0d0d0;background-color:#202020;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-bash data-lang=bash><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868"> 1</span><span><span style=color:#cd2828;font-weight:700>#!/usr/bin/bash
</span></span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868"> 2</span><span><span style=color:#cd2828;font-weight:700></span><span style=color:#24909d>trap</span> <span style=color:#ed9d13>"exit"</span> <span style=color:#3677a9>0</span>
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868"> 3</span><span>
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868"> 4</span><span><span style=color:#40ffff>MAXCONN</span>=<span style=color:#3677a9>1000</span> <span style=color:#999;font-style:italic># set this to whatever base max_connections you have defined in your my.conf setting</span>
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868"> 5</span><span><span style=color:#6ab825;font-weight:700>while</span> true; <span style=color:#6ab825;font-weight:700>do</span>
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868"> 6</span><span> <span style=color:#999;font-style:italic>#mysql -e "SHOW VARIABLES LIKE 'max_connections';"</span>
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868"> 7</span><span> <span style=color:#40ffff>THREADS</span>=<span style=color:#ed9d13>`</span>mysqladmin status | awk <span style=color:#ed9d13>'{print $4}'</span><span style=color:#ed9d13>`</span>
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868"> 8</span><span> <span style=color:#40ffff>THREADSINT</span>=<span style=color:#ed9d13>`</span><span style=color:#24909d>echo</span> <span style=color:#ed9d13>"</span><span style=color:#40ffff>$THREADS</span><span style=color:#ed9d13>"</span> | bc<span style=color:#ed9d13>`</span>
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868"> 9</span><span> <span style=color:#999;font-style:italic>#echo "Load is: $THREADS"</span>
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868">10</span><span> <span style=color:#40ffff>NEWMAX</span>=<span style=color:#40ffff>$MAXCONN</span>
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868">11</span><span> <span style=color:#6ab825;font-weight:700>if</span> [[ <span style=color:#40ffff>$THREADSINT</span> -ge <span style=color:#3677a9>1</span> ]]; <span style=color:#6ab825;font-weight:700>then</span>
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868">12</span><span> <span style=color:#40ffff>NEWMAX</span>=<span style=color:#3677a9>1000</span>
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868">13</span><span> <span style=color:#6ab825;font-weight:700>fi</span>
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868">14</span><span> <span style=color:#6ab825;font-weight:700>if</span> [[ <span style=color:#40ffff>$THREADSINT</span> -ge <span style=color:#3677a9>600</span> ]]; <span style=color:#6ab825;font-weight:700>then</span>
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868">15</span><span> <span style=color:#40ffff>NEWMAX</span>=<span style=color:#3677a9>2000</span>
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868">16</span><span> <span style=color:#6ab825;font-weight:700>fi</span>
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868">17</span><span> <span style=color:#6ab825;font-weight:700>if</span> [[ <span style=color:#40ffff>$THREADSINT</span> -ge <span style=color:#3677a9>1400</span> ]]; <span style=color:#6ab825;font-weight:700>then</span>
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868">18</span><span> <span style=color:#40ffff>NEWMAX</span>=<span style=color:#3677a9>3000</span>
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868">19</span><span> <span style=color:#6ab825;font-weight:700>fi</span>
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868">20</span><span> <span style=color:#6ab825;font-weight:700>if</span> [[ <span style=color:#40ffff>$THREADSINT</span> -ge <span style=color:#3677a9>2400</span> ]]; <span style=color:#6ab825;font-weight:700>then</span>
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868">21</span><span> <span style=color:#40ffff>NEWMAX</span>=<span style=color:#3677a9>4000</span>
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868">22</span><span> <span style=color:#6ab825;font-weight:700>fi</span>
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868">23</span><span> <span style=color:#6ab825;font-weight:700>if</span> [[ <span style=color:#40ffff>$THREADSINT</span> -ge <span style=color:#3677a9>3400</span> ]]; <span style=color:#6ab825;font-weight:700>then</span>
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868">24</span><span> <span style=color:#40ffff>NEWMAX</span>=<span style=color:#3677a9>5000</span>
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868">25</span><span> <span style=color:#6ab825;font-weight:700>fi</span>
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868">26</span><span> <span style=color:#6ab825;font-weight:700>if</span> [[ <span style=color:#40ffff>$NEWMAX</span> -ne <span style=color:#40ffff>$MAXCONN</span> ]]; <span style=color:#6ab825;font-weight:700>then</span>
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868">27</span><span> mysql -e <span style=color:#ed9d13>"set global max_connections = </span><span style=color:#40ffff>$NEWMAX</span><span style=color:#ed9d13>;"</span>
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868">28</span><span> <span style=color:#999;font-style:italic>#echo "increased: $NEWMAX"</span>
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868">29</span><span> <span style=color:#40ffff>MAXCONN</span>=<span style=color:#40ffff>$NEWMAX</span>
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868">30</span><span> <span style=color:#6ab825;font-weight:700>fi</span>
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868">31</span><span> sleep <span style=color:#3677a9>3</span>
</span></span><span style=display:flex><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#686868">32</span><span><span style=color:#6ab825;font-weight:700>done</span>
</span></span></code></pre></div><p>If <code>mysqladmin status</code> gives error “connect to server at ’localhost’ failed”, make sure you have your credentials stored in <code>~/.my.cnf</code></p><p>I have a separate mysql server, runing PerconaDB inside docker, so in my case my <code>~/.my.cnf</code> looks like this:</p><pre tabindex=0><code>[client]
protocol=tcp
port=3306
user=root
password="secret"
</code></pre><hr><p>You can run this script on startup by creating a
<a href=https://linuxconfig.org/how-to-run-script-on-startup-on-ubuntu-20-04-focal-fossa-server-desktop target=_blank rel=noopener>systemd service</a>
or by using
<a href=https://www.digitalocean.com/community/tutorials/how-to-install-and-manage-supervisor-on-ubuntu-and-debian-vps target=_blank rel=noopener>supervisor</a>
.</p><hr><p>An easier setup is by runing a cron job every minute. If you do a while loop in a cron job, you will end up with unlimited proceses spawned and we don’t want that. Instead we will replace while with a for loop:</p><pre tabindex=0><code># replace `while true; do` with
for i in {1..20}; do
</code></pre><p>For loop for 20 iterations because each loop sleeps for 3 seconds. So <code>20 * 3 = 60</code> seconds assuming our code does not take too long to execute.</p><p>Now run command <code>crontab -e</code> and add a cron job for this:</p><pre tabindex=0><code>* * * * * bash /root/watch-mysql.sh
</code></pre><hr width=100% id=EOF><p style=color:#777>Last modified on 2024-11-18</p>