Session, in computers, especially in network applications, is called a "session".
A server has relatively large traffic. Due to the needs of the program, the session expiration time is set to 3 hours, resulting in the accumulation of nearly 200,000 session files under /tmp. This in turn leads to a sharp increase in CPU usage by the kernel. Because session reading and writing involves random reading and writing of a large number of small files, and they are concentrated in one directory, iowait also increases sharply.
First consider putting the session into memory
The easiest way is to mount /tmp as a tmpfs file system, that is, in memory
The second step is to store the session in a different directory
php itself supports multi-level hashing of session
In php.ini, change
<ol class="dp-c"><li class="alt"><span><span>session.save_path = /tmp; </span></span></li></ol>
is changed to
<ol class="dp-c"><li class="alt"><span><span>session.save_path = </span><span class="string">"2;/tmp/session"</span><span> </span></span></li></ol>
means to store the session in the /tmp/session folder. And it uses 2 and hashing.
Save and exit, restart php after the third step is completed
The third step, create the session storage folder
php will not automatically go there Create these folders, but some scripts for creating the folders are provided in the source file. The following script is also easy to use
<ol class="dp-c"> <li class="alt"><span><span>I=</span><span class="string">"0 1 2 3 4 5 6 7 8 9 a b c d e f"</span><span> </span></span></li> <li> <span class="keyword">for</span><span> acm in </span><span class="vars">$I</span><span>; </span> </li> <li class="alt"> <span class="keyword">do</span><span> </span> </li> <li> <span class="keyword">for</span><span> x in </span><span class="vars">$I</span><span>; </span> </li> <li class="alt"> <span class="keyword">do</span><span> </span> </li> <li> <span class="func">mkdir</span><span> -p /tmp/session/</span><span class="vars">$acm</span><span>/</span><span class="vars">$x</span><span>; </span> </li> <li class="alt"><span>done; </span></li> <li><span>done </span></li> <li class="alt"> <span class="func">chown</span><span> -R nobody:nobody /tmp/session </span> </li> <li> <span class="func">chmod</span><span> -R 1777 /tmp/session </span> </li> </ol>
Because /tmp is used for memory, all files in it will be lost after the server is restarted, so you need to add the above script to /etc/rc.local , and should be placed before starting php
The fourth step, session recycling
The session will expire after session.gc_maxlifetime, but will not be deleted immediately , after a long time, it will cause /tmp space to occupy a lot of space. I'm too lazy to study the specific deletion algorithm. The following command can delete expired sessions. The expiration time I define here is 3 hours.
<ol class="dp-c"><li class="alt"><span><span>find /tmp/session -amin +180 -</span><span class="func">exec</span><span> rm -rf {} ; </span></span></li></ol>
Put it into cron, execute it every 10 minutes, and you’re done.
This article introduces Session hashing and expired recycling in four steps. I hope it will be helpful to you.