performance - EC2 userdata 脚本在 Centos7 AMI 上运行非常缓慢
问题描述
每次用户数据脚本从 AWS 市场触及 centos 7 AMI 上的磁盘时,似乎都会有 25 秒的延迟。
这是我的脚本:
#!/bin/bash -ex
echo "[TIMER] START $(date +%s.%N)"
current_user=$(whoami)
echo "Running as: $current_user"
sudo id -u myuser &>/dev/null || sudo useradd myuser
echo "[TIMER] CreatedUser $(date +%s.%N)"
time sudo yum update -y
echo "[TIMER] Yum Update $(date +%s.%N)"
sudo mkdir -p /opt/myuser/resources
echo "[TIMER] Create /opt/myuser/resources $(date +%s.%N)"
sudo bash -c "cat > /etc/systemd/system/my-service.service" <<EOF
[Unit]
Description=My Service
After=network-online.target
[Service]
User=myuser
Group=myuser
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/bash -ex -c 'echo "Hello World"'
[Install]
Alias=my-service
WantedBy=default.target
EOF
echo "[TIMER] Make my-service.service $(date +%s.%N)"
sudo chmod 644 /etc/systemd/system/my-service.service
echo "[TIMER] Chmod $(date +%s.%N)"
sudo systemctl daemon-reload
echo "[TIMER] daemon-reload $(date +%s.%N)"
sudo systemctl enable my-service
echo "[TIMER] enable $(date +%s.%N)"
sudo systemctl start my-service
echo "[TIMER] END: my-service $(date +%s.%N)"
我启动了这个 AMI 的 c5.large 并将上面的内容用作我的用户数据脚本:https ://aws.amazon.com/marketplace/pp/B00O7WM7QW
计时器结果:
[TIMER] START 1546978269.809559549
[TIMER] CreatedUser 1546978320.472706964
[TIMER] Yum Update 1546978356.991642552
[TIMER] Create /opt/myuser/resources 1546978382.033044767
[TIMER] Make my-service.service 1546978407.074353857
[TIMER] Chmod 1546978432.111791937
[TIMER] daemon-reload 1546978457.195078083
[TIMER] enable 1546978482.265036318
[TIMER] END: my-service 1546978507.313735938
| CENTOS 7 | | | |------------------------------------------------- ----------|----------|-------------| | | | | | 日志 | 时间戳 | 秒 | | [定时器] 开始 1546978269.809559549 | 1546978269.809559549 | | | [定时器] 创建用户 1546978320.472706964 | 1546978320.472706964 | 50.66315007 | | [定时器] 百胜更新 1546978356.991642552 | 1546978356.991642552 | 36.51893997 | | [定时器] 创建 /opt/myuser/resources 1546978382.033044767 | 1546978382.033044767 | 25.04139996 | | [TIMER] 使 my-service.service 1546978407.074353857 | 1546978407.074353857 | 25.04131007 | | [定时器] Chmod 1546978432.111791937 | 1546978432.111791937 | 25.03743982 | | [TIMER] 守护进程重载 1546978457.195078083 | 1546978457.195078083 | 25.08328009 | | [定时器] 启用 1546978482.265036318 | 1546978482.265036318 | 25.06995988 | | [定时器] 结束:我的服务 1546978507.313735938 | 1546978507.313735938 | 25.04870009 | | | | | | | 总计 | 237.50418 | | | | | | | 总计(米)| 3.958402999 |
如果您在我的 ASCII 表中向右滚动,您会看到像mkdir
、chmod
和等简单命令useradd
需要 25 秒。为什么会这样?
编辑:
的内容/etc/hosts
$ hostname
ip-172-31-40-213.us-west-2.compute.internal
$ cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
来自的示例日志/var/log/messages
,systemd 日志显示创建 sudo 会话需要 25 秒:
Jan 9 23:50:32 ip-172-31-35-166 cloud-init: + echo '[TIMER] Make my-service.service 1547077832.899069408'
Jan 9 23:50:32 ip-172-31-35-166 cloud-init: [TIMER] Make my-service.service 1547077832.899069408
Jan 9 23:50:32 ip-172-31-35-166 cloud-init: + sudo chmod 644 /etc/systemd/system/my-service.service
Jan 9 23:50:32 ip-172-31-35-166 systemd: Removed slice User Slice of root.
Jan 9 23:50:32 ip-172-31-35-166 systemd: Created slice User Slice of root.
Jan 9 23:50:32 ip-172-31-35-166 systemd: Started Session c3 of user root.
Jan 9 23:50:57 ip-172-31-35-166 cloud-init: ++ date +%s.%N
Jan 9 23:50:57 ip-172-31-35-166 cloud-init: + echo '[TIMER] Chmod 1547077857.946078493'
Jan 9 23:50:57 ip-172-31-35-166 cloud-init: [TIMER] Chmod 1547077857.946078493
journalctl
日志显示可能的罪魁祸首:
Jan 09 23:50:32 ip-172-31-35-166.us-west-2.compute.internal cloud-init[1197]: + echo '[TIMER] Make my-service.service 1547077832.899069408'
Jan 09 23:50:32 ip-172-31-35-166.us-west-2.compute.internal cloud-init[1197]: [TIMER] Make my-service.service 1547077832.899069408
Jan 09 23:50:32 ip-172-31-35-166.us-west-2.compute.internal cloud-init[1197]: + sudo chmod 644 /etc/systemd/system/my-service.service
Jan 09 23:50:32 ip-172-31-35-166.us-west-2.compute.internal systemd[1]: Removed slice User Slice of root.
Jan 09 23:50:32 ip-172-31-35-166.us-west-2.compute.internal sudo[13392]: root : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/bin/chmod 644 /etc/systemd/system/my-service.service
Jan 09 23:50:32 ip-172-31-35-166.us-west-2.compute.internal systemd[1]: Created slice User Slice of root.
Jan 09 23:50:32 ip-172-31-35-166.us-west-2.compute.internal systemd[1]: Started Session c3 of user root.
Jan 09 23:50:57 ip-172-31-35-166.us-west-2.compute.internal sudo[13392]: pam_systemd(sudo:session): Failed to create session: Connection timed out
Jan 09 23:50:57 ip-172-31-35-166.us-west-2.compute.internal sudo[13392]: pam_unix(sudo:session): session opened for user root by (uid=0)
Jan 09 23:50:57 ip-172-31-35-166.us-west-2.compute.internal sudo[13392]: pam_unix(sudo:session): session closed for user root
Jan 09 23:50:57 ip-172-31-35-166.us-west-2.compute.internal cloud-init[1197]: ++ date +%s.%N
Jan 09 23:50:57 ip-172-31-35-166.us-west-2.compute.internal cloud-init[1197]: + echo '[TIMER] Chmod 1547077857.946078493'
Jan 09 23:50:57 ip-172-31-35-166.us-west-2.compute.internal cloud-init[1197]: [TIMER] Chmod 1547077857.946078493
谷歌搜索更多,我发现:https ://github.com/systemd/systemd/issues/2863
这已在更高版本的 systemd 中得到修复,但 AWS EC2 上的 centos 附带 systemd 版本 219,我自己无法真正更新它。有什么建议么?我可以放置一些配置来避免这个问题吗?我可以在我的 userdata 脚本中删除大多数sudo 实例,但我确实需要它来执行以下操作:
sudo -H -u myuser bash -ex <<EOF
... commands
EOF
FWIW Amazon Linux 2 带有相同版本的 systemd,但没有表现出这种行为。
解决方案
推荐阅读
- docx - python-docx 获取单词位置和属性
- go - Go中函数的通道返回类型中的`<-`是什么意思?
- j - 给定动名词,如何计算 f1(f2(...fn(x)...))?
- bash - 我在 Cent Os 7 bash shell 上运行 korn 脚本 (ksh)。“getopts”没有按预期工作。我究竟做错了什么?
- c# - Wpf Material Design Card 更改代码中的不透明度
- java - java.lang.NoClassDefFoundError: com/google/common/collect/ImmutableMap 错误在 Java 中通过 Selenium 使用 GeckoDriver Firefox
- amazon-web-services - 使用数据管道复制数据
- python - 如何组合 1 位数据和 8 位数据?
- symfony - 与主键无关的教义关系
- spring-boot - Spring Boot 构造函数注入来帮助测试。为什么它比使用 Mockito @InjectMocks 更好?与现场注入相比的其他好处?