正如问题标题所暗示的那样,我很难弄清楚可以在我的应用程序上进行哪些改进(或在 os、ubuntu 中进行调整)以达到可接受的性能。但首先我将解释架构:
前端服务器是一台运行 Ubuntu 12.04 的 8 核机器,具有 8 个演出内存。该应用程序完全用 javascript 编写并在 node.js v 0.8.22 中运行(因为某些模块似乎在较新版本的节点上抱怨)我使用 nginx 1.4 将 http 流量从端口 80 和 443 代理到被管理的 8 个节点工作器并开始使用节点集群 api。我使用最新版本的 socket.io 0.9.14 来处理 websocket 连接,我只启用了 websockets 和 xhr-polling 作为可用传输。在这台机器上,我还运行了一个 Redis(2.2) 实例
我将持久数据(如用户和分数)存储在 mongodb(3.6) 上的第二台服务器上,具有 4gigs RAM 和 2 个内核。
该应用程序从几个月开始就投入生产(直到几周前它一直在一个机器上运行)并且每天有大约 18,000 名用户使用它。除了一个主要问题:性能下降之外,它一直工作得很好。随着使用,每个进程使用的 cpu 量会增加,直到它达到工作人员(不再为请求提供服务)为止。我暂时解决了它每分钟检查每个工人正在使用的cpu,如果达到98%则重新启动它。所以这里的问题主要是cpu,而不是RAM。RAM不再是问题,因为我已经更新到socket.io 0.9.14(早期版本正在泄漏内存)所以我怀疑这是一个内存泄漏问题,特别是因为现在它是cpu增长相当快(我必须每天重启每个工人大约 10-12 次!)。老实说,正在使用的 RAM 也在增长,但是很慢,每使用 2-3 天 1 gig,奇怪的是,即使我完全重新启动整个应用程序,它也没有发布。只有在我重新启动服务器时才会释放它!这我真的无法理解......
我现在发现nodefly很棒,所以我终于可以看到我的生产服务器上发生了什么,并且我从几天开始收集数据。如果有人想查看图表,我可以让您访问,但基本上我可以看到我有 80 到 200 个并发连接!我期待 node.js 处理数千个请求,而不是数百个请求。此外,http 流量的平均响应时间在 500 到 1500 毫秒之间浮动,我认为这确实很多。此外,在这个有 1300 个用户在线的时刻,这是“ss -s”的输出:
Total: …Run Code Online (Sandbox Code Playgroud) 我一直在试用 Azure Redis 缓存预览版,到目前为止,一切都很好。但是,当我不使用它时,我想禁用它,这样它就不会消耗内存并且无法访问。
我不想删除它,因为我不希望每次运行一些测试时都创建一个新实例。但是在门户中,没有禁用或停用选项,只需删除即可。
我已经查看了http://msdn.microsoft.com/en-us/library/azure/dn690523.aspx 上的文档,但没有找到解决方案。
我正在尝试使用以下行在 centos 6.5 (x64) 上安装 Redis:
yum install redis
Run Code Online (Sandbox Code Playgroud)
但我得到以下屏幕:
[root@NodeJs ~]# yum install redis
Loaded plugins: fastestmirror
Setting up Install Process
Loading mirror speeds from cached hostfile
* base: nl.mirror.eurid.eu
* epel: nl.mirror.eurid.eu
* extras: mirror.denit.net
* updates: nl.mirror.eurid.eu
Resolving Dependencies
--> Running transaction check
---> Package redis.x86_64 0:2.8.14-2.el7 will be installed
--> Processing Dependency: systemd for package: redis-2.8.14-2.el7.x86_64
--> Processing Dependency: systemd for package: redis-2.8.14-2.el7.x86_64
--> Processing Dependency: libjemalloc.so.1()(64bit) for package: redis-2.8.14-2.el7.x86_64
--> Running transaction check
---> Package …Run Code Online (Sandbox Code Playgroud) 我们正在为我们的站点使用 ElastiCache - Redis,我们需要刷新 Redis 缓存,当我尝试从任何 PC 通过此命令远程连接到我的 ElastiCache - Redis 时
redis-cli -h example-redis-1.example.0001.euw1.cache.amazonaws.com -p 6379
Run Code Online (Sandbox Code Playgroud)
它总是说:
无法在 example-redis-1.example.0001.euw1.cache.amazonaws.com:6379 处连接到 Redis:连接被拒绝,未连接>
我已确保入站规则允许来自任何 IP 的 6379 并尝试编辑 /etc/redis.conf 以添加绑定 example-redis-1.example.0001.euw1.cache.amazonaws.com 但即使错误仍然存在相同的。
我想protected-mode在我的生产 Redis上禁用。关于我从我的另一个 Redis-Sentinel 实例中得到的以下错误,我可以通过从它运行的主计算机连接到 Redis 来实时禁用它。
DENIED Redis 在保护模式下运行,因为已启用保护模式,未指定绑定地址,未向客户端请求身份验证密码。在此模式下,仅接受来自环回接口的连接。如果您想从外部计算机连接到 Redis,您可以采用以下解决方案之一:
1)只需禁用保护模式,通过从运行服务器的同一主机连接到Redis,从环回接口发送命令'CONFIG SET protected-mode no',但是如果这样做,请确保Redis不能从互联网公开访问。使用 CONFIG REWRITE 使此更改永久化。
2) 或者,您可以通过编辑 Redis 配置文件并将保护模式选项设置为“no”,然后重新启动服务器来禁用保护模式。
3) 如果您手动启动服务器只是为了测试,请使用“--protected-mode no”选项重新启动它。
4) 设置绑定地址或认证密码。
注意:您只需要执行上述操作之一,服务器就可以开始接受来自外部的连接。
但是当我连接并尝试禁用它时,我收到了 Error (error) ERR Unsupported CONFIG parameter: protected-mode。
没有配置身份验证或其他任何东西 - 所有安全性都由防火墙规则管理。在redis.conf几乎是默认的。
root@svim-redis03 /etc/redis # redis-cli
127.0.0.1:6379> CONFIG GET protected*
(empty list or set)
127.0.0.1:6379> CONFIG GET bind*
1) "bind"
2) "127.0.0.1"
127.0.0.1:6379> CONFIG SET protected-mode no
(error) ERR Unsupported CONFIG parameter: protected-mode
127.0.0.1:6379> exit
root@svim-redis03 /etc/redis # …Run Code Online (Sandbox Code Playgroud) 我想在我的服务器上阻止对端口 6379 的访问,但我仍然想在内部连接到它。redis-server 应用程序在该端口上运行,我只想在本地 (127.0.0.1) 连接到它。我怎样才能做到这一点?
我在 redis.log 文件的顶部看到了这个错误:
当前最大打开文件数为 1024。maxclients 已减少到 4064 以补偿较低的 ulimit。
我已按照以下步骤操作(并重新启动):
此外,我在运行时看到了这一点ulimit:
ubuntu@ip-XX-XXX-XXX-XXX:~$ ulimit -n
65535
Run Code Online (Sandbox Code Playgroud)
这个错误似是而非吗?如果没有,我还需要执行哪些其他步骤?我在 Ubuntu LTS 14.04.1(再次,树尖)上运行 redis 2.8.13(树尖)。
这是用户信息:
ubuntu@ip-XX-XXX-XXX-XXX:~$ ps aux | grep redis
root 1027 0.0 0.0 66328 2112 ? Ss 20:30 0:00 sudo -u ubuntu /usr/local/bin/redis-server /etc/redis/redis.conf
ubuntu 1107 19.2 48.8 7629152 7531552 ? Sl 20:30 2:21 /usr/local/bin/redis-server *:6379
Run Code Online (Sandbox Code Playgroud)
因此,服务器作为 ubuntu 运行。
这是我的limits.conf文件,没有注释:
ubuntu@ip-XX-XXX-XXX-XXX:~$ cat /etc/security/limits.conf | sed '/^#/d;/^$/d'
ubuntu soft nofile 65535
ubuntu hard nofile 65535
root soft nofile …Run Code Online (Sandbox Code Playgroud) 我有一个 Redis 3.0.5 实例,随着时间的推移,它往往会显示 mem_fragmentation_ratio 的增长。
使用该实例的应用程序不断地创建和删除密钥。
一个月后,我的结果是 mem_fragmentation_ratio > 1.30。这会影响 Redis 在该服务器上的内存占用:
~$ redis-cli info memory
# Memory
used_memory:7711297480
used_memory_human:7.18G
used_memory_rss:10695098368
used_memory_peak:11301744128
used_memory_peak_human:10.53G
used_memory_lua:95232
mem_fragmentation_ratio:1.39
mem_allocator:jemalloc-3.6.0
Run Code Online (Sandbox Code Playgroud)
如果我重新启动 Redis 服务并从 AOF 重新加载,mem_fragmentation_ratio 会回到可接受的水平 (1.06):
~$ redis-cli info memory
# Memory
used_memory:7493466968
used_memory_human:6.98G
used_memory_rss:7924920320
used_memory_peak:8279112992
used_memory_peak_human:7.71G
used_memory_lua:91136
mem_fragmentation_ratio:1.06
mem_allocator:jemalloc-3.6.0
Run Code Online (Sandbox Code Playgroud)
回收 Redis 正在影响我们的应用程序(即使我们在从服务器重启后使用 Sentinel 故障转移来执行此操作)。
是否有另一种方法可以减少 mem_fragmentation_ratio,例如我可以安排非高峰期的“碎片整理”过程?
我在 Redis 日志中看到以下内容:
1182:M 30 Nov 14:27:00.028 * 1 changes in 900 seconds. Saving...
1182:M 30 Nov 14:27:00.029 * Background saving started by pid 1920
1920:C 30 Nov 14:27:00.029 # Failed opening .rdb for saving: Read-only file system
1182:M 30 Nov 14:27:00.130 # Background saving error
Run Code Online (Sandbox Code Playgroud)
Redis 配置为使用此目录:
ubuntu@XXXXX:~$ redis-cli
127.0.0.1:6379> config get dir
1) "dir"
2) "/mnt/persistent/redis-data"
Run Code Online (Sandbox Code Playgroud)
如果我成为 redis 用户,我可以很好地写入该目录:
ubuntu@XXXXX:~$ sudo su - redis
redis@XXXXX:~$ touch /mnt/persistent/redis-data/caniwrite
redis@XXXXX:~$ ls /mnt/persistent/redis-data/caniwrite
/mnt/persistent/redis-data/caniwrite
Run Code Online (Sandbox Code Playgroud)
它似乎以读写方式安装:
root@XXXXX:~# mount -l | grep /mnt/persistent …Run Code Online (Sandbox Code Playgroud) 根据 aws,Amazon Linux 2023 松散地基于 Fedora 34、35 和 36: https: //docs.aws.amazon.com/linux/al2023/ug/relationship-to-fedora.html
但是,redis该包在 AL2023 中不可用,而是redis6可用: https: //docs.aws.amazon.com/linux/al2023/release-notes/all-packages-al2023-20230322.html
我尝试使用它安装它sudo dnf -y install redis6并且安装成功。但我找不到任何 redis 配置文件。redis6已创建一个文件夹,并且可以使用该文件夹进行访问sudo cd /etc/redis6,但是该文件夹是空的并且没有任何配置文件。ls里面/etc/redis6没有返回任何东西。
在AL2023中安装redis服务器的正确方法是什么?
[UPDATE]
ls命令未返回/etc/redis6文件夹内的任何文件,但配置文件实际上可用。使用sudo nano /etc/redis6/redis6.conf我能够更新现有的 redis 配置文件以使用 systemd 并设置密码。
所以redis服务器现在工作正常,只需要使用redis6而不是redisAL2023中的任何地方,例如redis6-cli.
redis ×10
ubuntu ×2
amazon-ebs ×1
amazon-ec2 ×1
amazon-linux ×1
aws-ec2 ×1
azure ×1
centos ×1
centos6 ×1
fedora ×1
memory-usage ×1
mongodb ×1
nginx ×1
node.js ×1
port ×1
ssh ×1
ulimit ×1