


How 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!

PHP is widely used in e-commerce, content management systems and API development. 1) E-commerce: used for shopping cart function and payment processing. 2) Content management system: used for dynamic content generation and user management. 3) API development: used for RESTful API development and API security. Through performance optimization and best practices, the efficiency and maintainability of PHP applications are improved.

PHP makes it easy to create interactive web content. 1) Dynamically generate content by embedding HTML and display it in real time based on user input or database data. 2) Process form submission and generate dynamic output to ensure that htmlspecialchars is used to prevent XSS. 3) Use MySQL to create a user registration system, and use password_hash and preprocessing statements to enhance security. Mastering these techniques will improve the efficiency of web development.

PHP and Python each have their own advantages, and choose according to project requirements. 1.PHP is suitable for web development, especially for rapid development and maintenance of websites. 2. Python is suitable for data science, machine learning and artificial intelligence, with concise syntax and suitable for beginners.

PHP is still dynamic and still occupies an important position in the field of modern programming. 1) PHP's simplicity and powerful community support make it widely used in web development; 2) Its flexibility and stability make it outstanding in handling web forms, database operations and file processing; 3) PHP is constantly evolving and optimizing, suitable for beginners and experienced developers.

PHP remains important in modern web development, especially in content management and e-commerce platforms. 1) PHP has a rich ecosystem and strong framework support, such as Laravel and Symfony. 2) Performance optimization can be achieved through OPcache and Nginx. 3) PHP8.0 introduces JIT compiler to improve performance. 4) Cloud-native applications are deployed through Docker and Kubernetes to improve flexibility and scalability.

PHP is suitable for web development, especially in rapid development and processing dynamic content, but is not good at data science and enterprise-level applications. Compared with Python, PHP has more advantages in web development, but is not as good as Python in the field of data science; compared with Java, PHP performs worse in enterprise-level applications, but is more flexible in web development; compared with JavaScript, PHP is more concise in back-end development, but is not as good as JavaScript in front-end development.

PHP and Python each have their own advantages and are suitable for different scenarios. 1.PHP is suitable for web development and provides built-in web servers and rich function libraries. 2. Python is suitable for data science and machine learning, with concise syntax and a powerful standard library. When choosing, it should be decided based on project requirements.

PHP is a scripting language widely used on the server side, especially suitable for web development. 1.PHP can embed HTML, process HTTP requests and responses, and supports a variety of databases. 2.PHP is used to generate dynamic web content, process form data, access databases, etc., with strong community support and open source resources. 3. PHP is an interpreted language, and the execution process includes lexical analysis, grammatical analysis, compilation and execution. 4.PHP can be combined with MySQL for advanced applications such as user registration systems. 5. When debugging PHP, you can use functions such as error_reporting() and var_dump(). 6. Optimize PHP code to use caching mechanisms, optimize database queries and use built-in functions. 7


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Safe Exam Browser
Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.

MantisBT
Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

SecLists
SecLists is the ultimate security tester's companion. It is a collection of various types of lists that are frequently used during security assessments, all in one place. SecLists helps make security testing more efficient and productive by conveniently providing all the lists a security tester might need. List types include usernames, passwords, URLs, fuzzing payloads, sensitive data patterns, web shells, and more. The tester can simply pull this repository onto a new test machine and he will have access to every type of list he needs.

ZendStudio 13.5.1 Mac
Powerful PHP integrated development environment