背景:

kubernetes集群中部署应用,对应用进行压力测试。jmeter进行压力测试大概是每秒300个左右的请求(每分钟elasticsearch中采集的请求有18000个)。查看日志有nginx的erro log:

7dd81543f00530fe566f1ca63e8c334.png
但是我的cpu 内存资源也都没有打满。通过搜索引擎搜索发现与下面博客的环境基本相似,php-fpm也是走的socket:
image.png

参见:http://www.bubuko.com/infodetail-3600189.html

解决问题:

修改net.core.somaxconn

进入自己的nginx-php容器查看:

  1. bash-5.0# cat /proc/sys/net/core/somaxconn
  2. 128

Kuberntes中Sysctl中的配置(php-fpm并发只能300) - 图3
随机找了一个work节点查看主机的somaxconn:

  1. root@ap-shanghai-k8s-node-1:~# cat /proc/sys/net/core/somaxconn
  2. 32768

注:这是一个tke集群。参数都是默认的。未进行修改
下面修改一下应用的配置文件:

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: paper-miniprogram
  5. spec:
  6. replicas: 1
  7. strategy:
  8. rollingUpdate:
  9. maxSurge: 1
  10. maxUnavailable: 0
  11. selector:
  12. matchLabels:
  13. app: paper-miniprogram
  14. template:
  15. metadata:
  16. labels:
  17. app: paper-miniprogram
  18. spec:
  19. containers:
  20. - name: paper-miniprogram
  21. image: ccr.ccs.tencentyun.com/xxxx/paper-miniprogram:{data}
  22. ports:
  23. - containerPort: 80
  24. resources:
  25. requests:
  26. memory: "1024M"
  27. cpu: "1000m"
  28. limits:
  29. memory: "1024M"
  30. cpu: "1000m"
  31. imagePullSecrets:
  32. - name: tencent
  33. ---
  34. apiVersion: v1
  35. kind: Service
  36. metadata:
  37. name: paper-miniprogram
  38. labels:
  39. app: paper-miniprogram
  40. spec:
  41. ports:
  42. - port: 80
  43. protocol: TCP
  44. targetPort: 80
  45. selector:
  46. app: paper-miniprogram

修改如下:
增加initContainers配置

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: paper-miniprogram
  5. spec:
  6. replicas: 1
  7. strategy:
  8. rollingUpdate:
  9. maxSurge: 1
  10. maxUnavailable: 0
  11. selector:
  12. matchLabels:
  13. app: paper-miniprogram
  14. template:
  15. metadata:
  16. labels:
  17. app: paper-miniprogram
  18. spec:
  19. containers:
  20. - name: paper-miniprogram
  21. image: ccr.ccs.tencentyun.com/xxxx/paper-miniprogram:{data}
  22. ports:
  23. - containerPort: 80
  24. resources:
  25. requests:
  26. memory: "1024M"
  27. cpu: "1000m"
  28. limits:
  29. memory: "1024M"
  30. cpu: "1000m"
  31. initContainers:
  32. - image: busybox
  33. command:
  34. - sh
  35. - -c
  36. - echo 1000 > /proc/sys/net/core/somaxconn
  37. imagePullPolicy: Always
  38. name: setsysctl
  39. securityContext:
  40. privileged: true
  41. imagePullSecrets:
  42. - name: tencent
  43. ---
  44. apiVersion: v1
  45. kind: Service
  46. metadata:
  47. name: paper-miniprogram
  48. labels:
  49. app: paper-miniprogram
  50. spec:
  51. ports:
  52. - port: 80
  53. protocol: TCP
  54. targetPort: 80
  55. selector:
  56. app: paper-miniprogram

php-fpm listen.backlog参数修改

先看一下系统变量net.ipv4.tcp_max_syn_backlog的参数值

  1. cat /proc/sys/net/core/netdev_max_backlog
  2. #OR
  3. sysctl -a|grep backlog

image.png
然后查看一下php中listen。backlog的配置:
image.png
511就先511吧不先修改了 如果修改这个值也要特权模式修改一下啊容器中net.ipv4.tcp_max_syn_backlog的值?

官方关于sysctl

kubernetes官方有syscl的用法说明的:https://kubernetes.io/zh/docs/tasks/administer-cluster/sysctl-cluster/

然后这样做的后遗症:

个人觉得特权模式会带来的安全等问题,还是不喜欢pod启用特权模式。

个人觉得比较好的方式:

  1. 通过grafana看板发现pod的资源利用率还是没有那么高。合理调整资源limits参数。

image.png
image.png

  1. 启用hpa 水平自动伸缩。
  2. 综上所述我还想想保持默认的net.core.somaxconn=128。而依靠更多的副本数去满足高负载。这也是符合使用容器的思想的思路。
  3. 关键是很多人认为扩大资源就可以提高并发负载量的思想是不对的.更应该去调优参数。

    关于php-fpm unix socket and tcp

    image.png

image.png
参见知乎:https://zhuanlan.zhihu.com/p/83958307
image.png

一些配置的可供参考:

https://github.com/gaoxt/blog/issues/9
https://blog.csdn.net/pcyph/article/details/46513521