search
HomeBackend DevelopmentPHP TutorialHow to troubleshoot HTTP 500: Internal Server Error with php+redis in actual projects

The number of users has grown rapidly, and the number of visits has doubled in a short period of time. Due to the good early capacity planning, the hardware resources can support it, but there is a big problem in the software system: 40% of the requests will return HTTP 500: Internal Server Error

Problem Description
The number of users has grown rapidly, and the number of visits has doubled in a short period of time. Due to the good early capacity planning, the hardware resources can support it, but the software system A big problem has arisen:
40% of requests will return HTTP 500: Internal Server Error
By looking at the log, I found that the error was in the connection processing of PHP Redis
Debugging Handling

The first time
The root cause was not found at the beginning, so we could only try various error-related methods, such as:
Add PHP connection number, and increase the timeout from 500ms to 2.5s
Disable default_socket_timeout in PHP settings
Disable SYN cookies in the host system
Check the number of file descriptors in Redis and Webservers
Increase the host System mbuffer
Adjust the number of TCP backlog
......

Tried many methods, but all ineffective

Second time
I want to pre-install I tried to reproduce this problem in the release environment. Unfortunately, it still failed. It should be because the traffic is not large enough to reproduce.

The third time
Could it be that Redis is not closed in the code? What about connections?
Normally speaking, PHP will automatically close the resource connection at the end of execution, but there will be memory leaks in older versions. To be on the safe side, modify the code and close the connection manually
The result is still invalid

The 4th time
Suspect target: phpredis client library
Do A/B testing, replace the predis library, and deploy it to 20% of the users in the data center
Thanks to the good code structure, the replacement work was completed quickly
But the result is still invalid, but there is also a good side, which can prove that phpredis is OK

5th time
I checked the Redis version and it was v2.6. The latest version at that time was v2.8.9
Try upgrading Redis. It still doesn’t work after the upgrade.
It’s okay. Stay optimistic. This is not convenient. Upgraded the Redis version to the latest

The 6th time
After searching a large number of documents, I found a good debugging method Redis Software Watchdog in the official documents. After opening it, execute:

$ redis-cli --latency -p 6380 -h 1.2.3.4
min: 0, max: 463, avg: 2.03 (19443 samples)

View the Redis log:

...
[20398] 22 May 09:20:55.351 * 10000 changes in 60 seconds. Saving...
[20398] 22 May 09:20:55.759 * Background saving started by pid 41941
[41941] 22 May 09:22:48.197 * DB saved on disk
[20398] 22 May 09:22:49.321 * Background saving terminated with success
[20398] 22 May 09:25:23.299 * 10000 changes in 60 seconds. Saving...
[20398] 22 May 09:25:23.644 * Background saving started by pid 42027
...

Found the problem:
Every other It only takes a few minutes to save data to the hard disk. Why does it take about 400ms to fork a background storage (you can see it from the time of the first and second logs above)

At this point, I finally found the root of the problem. Because there is a large amount of data in the Redis instance, it is very time-consuming to fork the background process for each persistence operation, and the keys are often modified in their business, which leads to frequent persistence triggers, which often causes problems with Redis. Blocking

Solution: Use a separate slave for persistence

This slave does not handle real traffic requests. Its only function is to handle persistence and perform persistence operations on the previous Redis instance. Transferring to this slave

The effect is very obvious and the problem is basically solved, but sometimes an error will still be reported

The 7th time
Troubleshoot the slowness that may block Redis Query and find that keys are used somewhere *

Because there is more and more data in Redis, this command will naturally cause serious blocking

You can use scan to replace it

The 8th time
After the previous adjustments, the problem has been solved. In the following months, even if the traffic continued to grow, it was able to withstand it

But they realized new problems :

The current method is to create a Redis connection when a request comes, execute a few commands, and then disconnect the connection. When the request volume is large, this method produces serious performance waste, more than half of which The commands are used to process connection operations, which exceed the processing of business logic and make Redis slow down.

Solution: Introduce proxy. They chose twitter's twemproxy, which only needs to be added to each webserver. When installing an agent on the computer, twemproxy is responsible for making persistent connections with Redis instances, which greatly reduces connection operations.

Twemproxy also has two convenient places:

Supports memcached
can be blocked Very time-consuming or dangerous commands, such as keys, flushall
The effect is naturally perfect, and you no longer have to worry about previous connection errors

9th time
Through data sharding Let’s continue the optimization:

Split and isolate data in different contexts
Consistent hash sharding of data in the same context
Effect:

Reduce the number of requests on each machine The request and load
improves the reliability of the cache and does not worry about node failure

The above is the entire content of this article, I hope it will be helpful to everyone's learning.


Related recommendations:

PHP method to obtain a 6-digit random number that does not exist in redisLaw

PHP implementationredisMessage queue publishing Weibo method

##CI framework (CodeIgniter) operationredis Step analysis

The above is the detailed content of How to troubleshoot HTTP 500: Internal Server Error with php+redis in actual projects. For more information, please follow other related articles on the PHP Chinese website!

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
What is the difference between unset() and session_destroy()?What is the difference between unset() and session_destroy()?May 04, 2025 am 12:19 AM

Thedifferencebetweenunset()andsession_destroy()isthatunset()clearsspecificsessionvariableswhilekeepingthesessionactive,whereassession_destroy()terminatestheentiresession.1)Useunset()toremovespecificsessionvariableswithoutaffectingthesession'soveralls

What is sticky sessions (session affinity) in the context of load balancing?What is sticky sessions (session affinity) in the context of load balancing?May 04, 2025 am 12:16 AM

Stickysessionsensureuserrequestsareroutedtothesameserverforsessiondataconsistency.1)SessionIdentificationassignsuserstoserversusingcookiesorURLmodifications.2)ConsistentRoutingdirectssubsequentrequeststothesameserver.3)LoadBalancingdistributesnewuser

What are the different session save handlers available in PHP?What are the different session save handlers available in PHP?May 04, 2025 am 12:14 AM

PHPoffersvarioussessionsavehandlers:1)Files:Default,simplebutmaybottleneckonhigh-trafficsites.2)Memcached:High-performance,idealforspeed-criticalapplications.3)Redis:SimilartoMemcached,withaddedpersistence.4)Databases:Offerscontrol,usefulforintegrati

What is a session in PHP, and why are they used?What is a session in PHP, and why are they used?May 04, 2025 am 12:12 AM

Session in PHP is a mechanism for saving user data on the server side to maintain state between multiple requests. Specifically, 1) the session is started by the session_start() function, and data is stored and read through the $_SESSION super global array; 2) the session data is stored in the server's temporary files by default, but can be optimized through database or memory storage; 3) the session can be used to realize user login status tracking and shopping cart management functions; 4) Pay attention to the secure transmission and performance optimization of the session to ensure the security and efficiency of the application.

Explain the lifecycle of a PHP session.Explain the lifecycle of a PHP session.May 04, 2025 am 12:04 AM

PHPsessionsstartwithsession_start(),whichgeneratesauniqueIDandcreatesaserverfile;theypersistacrossrequestsandcanbemanuallyendedwithsession_destroy().1)Sessionsbeginwhensession_start()iscalled,creatingauniqueIDandserverfile.2)Theycontinueasdataisloade

What is the difference between absolute and idle session timeouts?What is the difference between absolute and idle session timeouts?May 03, 2025 am 12:21 AM

Absolute session timeout starts at the time of session creation, while an idle session timeout starts at the time of user's no operation. Absolute session timeout is suitable for scenarios where strict control of the session life cycle is required, such as financial applications; idle session timeout is suitable for applications that want users to keep their session active for a long time, such as social media.

What steps would you take if sessions aren't working on your server?What steps would you take if sessions aren't working on your server?May 03, 2025 am 12:19 AM

The server session failure can be solved through the following steps: 1. Check the server configuration to ensure that the session is set correctly. 2. Verify client cookies, confirm that the browser supports it and send it correctly. 3. Check session storage services, such as Redis, to ensure that they are running normally. 4. Review the application code to ensure the correct session logic. Through these steps, conversation problems can be effectively diagnosed and repaired and user experience can be improved.

What is the significance of the session_start() function?What is the significance of the session_start() function?May 03, 2025 am 12:18 AM

session_start()iscrucialinPHPformanagingusersessions.1)Itinitiatesanewsessionifnoneexists,2)resumesanexistingsession,and3)setsasessioncookieforcontinuityacrossrequests,enablingapplicationslikeuserauthenticationandpersonalizedcontent.

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

PhpStorm Mac version

PhpStorm Mac version

The latest (2018.2.1) professional PHP integrated development tool

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

Dreamweaver Mac version

Dreamweaver Mac version

Visual web development tools

VSCode Windows 64-bit Download

VSCode Windows 64-bit Download

A free and powerful IDE editor launched by Microsoft

Atom editor mac version download

Atom editor mac version download

The most popular open source editor