🤡 一个小丑表情引发的血案
- 内容介绍
- 文章标签
- 相关推荐
这个事情实在过于离奇,这里做一个简单的排查记录,给自己提个醒下次再仔细一点。
社区的 discourse 版本是每天滚动更新的,这让我们及时避免了很多 bug 用上了很多新特性,当然也出过几次意外。
昨天的版本滚动更新之后,社区开始间歇性地报错 Bad Gateway (502) 。上服务器一看,workers 全挂,日志里看到的都是 workers 超时。
我们分析了一下 status.linux.do 日志,发现 502 发生的非常规律,一般是1个小时一次(也有例外),无一例外都发生在整点之后的几分钟。
尝试回滚版本,发现还真能解决问题。于是将范围锁定在这两个提交版本之间:419827bd ... 802fa4c3,逐个查看 commits。
这些提交里,只对 category.rb 有一次较大的改动,但这个改动只有一个 job 用到,那个 job 是 24 小时运行一次,不应该是它。
剩下的提交几乎没有对 rb 文件做什么改动,都是些一眼可见不会对性能造成什么影响的修改。
去代码里打了一堆日志,终于在一次 502 之后的日志分析中发现了一个 502 时运行过异常的任务: Jobs::DiscourseReactions::ScheduledLikeSynchronizer。
其实之前的排查也感觉到它不寻常,运行时间高达 180+ 秒,但都没当回事。因为 sidekiq 里几十上百秒的任务多得很,它们都是后台运行,没把服务器弄挂过。
我跟进这个脚本一看,直接倒吸一口凉气,一个 ActiveRecord::Base.transaction do 事务起手,里面操作的全是:post_actions、user_actions、posts、topics、user_stats、topic_users 这些高频表!
180+ 秒的行锁不放,那 workers 可不死完了么。。
再看提交记录,跟 Reactions 插件最相关的提交就是 3f3dfa61 UX: Reactions default improvements (#38776)。这个提交中settings.yml有一个不起眼的改动:
type: emoji_list
default: "-1"
validator: "ReactionsExcludedFromLikeSiteSettingValidator"
area: "emojis"
变为
discourse_reactions_excluded_from_like:
type: emoji_list
default: "-1|poop|face_with_symbols_on_mouth|enraged_face|face_vomiting|nauseated_face|angry|kitchen_knife|water_pistol|bomb|clown_face|unamused_face|roll_eyes|confused|smirking_face|disappointed_face|pensive_face|lying_face|weary_face|tired_face|confounded_face|persevering_face|smiling_face_with_horns|angry_face_with_horns|cigarette|person_gesturing_no|prohibited|no_entry|dagger|cross_mark"
validator: "ReactionsExcludedFromLikeSiteSettingValidator"
area: "emojis"
简单来说就是设置列表里加了一些不算赞的表情。之前 review 的时候也注意到了它,没当回事,因为这里新加的表情我们都没在用。直到看见这个唤起远古记忆的数据:
SELECT reaction_value, count(*) FROM discourse_reactions_reactions GROUP BY reaction_value ORDER BY count DESC;
reaction_value | count
----------------+---------
heart | 3656567
+1 | 372580
laughing | 317150
tieba_087 | 181617
open_mouth | 127642
distorted_face | 116042
hugs | 77945
clap | 75342
bili_057 | 28981
confetti_ball | 21645
clown_face | 3671
(11 rows)
真相大白,原来我们之前使用过 clown_face 也就是小丑表情
其实到这里事情就很清楚了,就因为这个表情,将原本十几秒的任务变成了一百多秒,导致了每个小时大量的 workers 因为事务的行锁而超时。
只需要把 clown_face 表情从 SiteSetting.discourse_reactions_excluded_from_like 里拿掉,一切就恢复正常了。
这种事,谁能想得到啊?我想不到,Claude、Gemini、ChatGPT也想不到,它们叽里呱啦说一堆废话。打死它们,它们也不会意识到是这个改动出了问题。
这下对AI替代人类的焦虑要轻一些了
网友解答:--【壹】--:
我喜欢发扭曲脸,我有罪。。我应该多发发小丑脸的
--【贰】--:
前排前排
--【叁】--:
--【肆】--:
前排前排
--【伍】--:
--【陆】--:
--【柒】--:
前排前排
--【捌】--:
前排前排
--【玖】--:
我以为,是我IP不够纯粹呢
--【拾】--:
前排,围观
--【拾壹】--:
前排前排
--【拾贰】--:
可恶的小丑
--【拾叁】--:
哈哈,可恶的小丑
--【拾肆】--:
所以应该多点表情!
--【拾伍】--:
前排前排
--【拾陆】--:
前排围观
--【拾柒】--:
哈哈哈哈
--【拾捌】--:
前排围观
--【拾玖】--:
前排前排
这个事情实在过于离奇,这里做一个简单的排查记录,给自己提个醒下次再仔细一点。
社区的 discourse 版本是每天滚动更新的,这让我们及时避免了很多 bug 用上了很多新特性,当然也出过几次意外。
昨天的版本滚动更新之后,社区开始间歇性地报错 Bad Gateway (502) 。上服务器一看,workers 全挂,日志里看到的都是 workers 超时。
我们分析了一下 status.linux.do 日志,发现 502 发生的非常规律,一般是1个小时一次(也有例外),无一例外都发生在整点之后的几分钟。
尝试回滚版本,发现还真能解决问题。于是将范围锁定在这两个提交版本之间:419827bd ... 802fa4c3,逐个查看 commits。
这些提交里,只对 category.rb 有一次较大的改动,但这个改动只有一个 job 用到,那个 job 是 24 小时运行一次,不应该是它。
剩下的提交几乎没有对 rb 文件做什么改动,都是些一眼可见不会对性能造成什么影响的修改。
去代码里打了一堆日志,终于在一次 502 之后的日志分析中发现了一个 502 时运行过异常的任务: Jobs::DiscourseReactions::ScheduledLikeSynchronizer。
其实之前的排查也感觉到它不寻常,运行时间高达 180+ 秒,但都没当回事。因为 sidekiq 里几十上百秒的任务多得很,它们都是后台运行,没把服务器弄挂过。
我跟进这个脚本一看,直接倒吸一口凉气,一个 ActiveRecord::Base.transaction do 事务起手,里面操作的全是:post_actions、user_actions、posts、topics、user_stats、topic_users 这些高频表!
180+ 秒的行锁不放,那 workers 可不死完了么。。
再看提交记录,跟 Reactions 插件最相关的提交就是 3f3dfa61 UX: Reactions default improvements (#38776)。这个提交中settings.yml有一个不起眼的改动:
type: emoji_list
default: "-1"
validator: "ReactionsExcludedFromLikeSiteSettingValidator"
area: "emojis"
变为
discourse_reactions_excluded_from_like:
type: emoji_list
default: "-1|poop|face_with_symbols_on_mouth|enraged_face|face_vomiting|nauseated_face|angry|kitchen_knife|water_pistol|bomb|clown_face|unamused_face|roll_eyes|confused|smirking_face|disappointed_face|pensive_face|lying_face|weary_face|tired_face|confounded_face|persevering_face|smiling_face_with_horns|angry_face_with_horns|cigarette|person_gesturing_no|prohibited|no_entry|dagger|cross_mark"
validator: "ReactionsExcludedFromLikeSiteSettingValidator"
area: "emojis"
简单来说就是设置列表里加了一些不算赞的表情。之前 review 的时候也注意到了它,没当回事,因为这里新加的表情我们都没在用。直到看见这个唤起远古记忆的数据:
SELECT reaction_value, count(*) FROM discourse_reactions_reactions GROUP BY reaction_value ORDER BY count DESC;
reaction_value | count
----------------+---------
heart | 3656567
+1 | 372580
laughing | 317150
tieba_087 | 181617
open_mouth | 127642
distorted_face | 116042
hugs | 77945
clap | 75342
bili_057 | 28981
confetti_ball | 21645
clown_face | 3671
(11 rows)
真相大白,原来我们之前使用过 clown_face 也就是小丑表情
其实到这里事情就很清楚了,就因为这个表情,将原本十几秒的任务变成了一百多秒,导致了每个小时大量的 workers 因为事务的行锁而超时。
只需要把 clown_face 表情从 SiteSetting.discourse_reactions_excluded_from_like 里拿掉,一切就恢复正常了。
这种事,谁能想得到啊?我想不到,Claude、Gemini、ChatGPT也想不到,它们叽里呱啦说一堆废话。打死它们,它们也不会意识到是这个改动出了问题。
这下对AI替代人类的焦虑要轻一些了
网友解答:--【壹】--:
我喜欢发扭曲脸,我有罪。。我应该多发发小丑脸的
--【贰】--:
前排前排
--【叁】--:
--【肆】--:
前排前排
--【伍】--:
--【陆】--:
--【柒】--:
前排前排
--【捌】--:
前排前排
--【玖】--:
我以为,是我IP不够纯粹呢
--【拾】--:
前排,围观
--【拾壹】--:
前排前排
--【拾贰】--:
可恶的小丑
--【拾叁】--:
哈哈,可恶的小丑
--【拾肆】--:
所以应该多点表情!
--【拾伍】--:
前排前排
--【拾陆】--:
前排围观
--【拾柒】--:
哈哈哈哈
--【拾捌】--:
前排围观
--【拾玖】--:
前排前排

