Cassandra使用ThreadPriorityPolicy = 42启动错误

时间:2018-02-17 17:57:37

标签: java multithreading cassandra jvm

当我尝试启动Cassandra时,它向我显示错误,我已经在env.sh中对conf文件进行了更改,该文件也是如此。

没有相似类型错误的选项可用于此。

intx ThreadPriorityPolicy=42 is outside the allowed range [ 0 ... 1 ]
Improperly specified VM option 'ThreadPriorityPolicy=42'
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

其他信息

java version "9.0.4"
Java(TM) SE Runtime Environment (build 9.0.4+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.4+11, mixed mode)

3 个答案:

答案 0 :(得分:5)

这是Cassandra的一个已知问题 - CASSANDRA-13107

在Java 9之前JVM接受webm的任何整数值,而0和1是唯一有效的值。

ThreadPriorityPolicy允许引发线程优先级,但仅当进程以ThreadPriorityPolicy=1权限启动时才允许。当root时,JVM显式checks表示euid = 0:

ThreadPriorityPolicy=1

注意上面代码中的错误(或后门):如果将static int prio_init() { if (ThreadPriorityPolicy == 1) { // Only root can raise thread priority. Don't allow ThreadPriorityPolicy=1 // if effective uid is not root. Perhaps, a more elegant way of doing // this is to test CAP_SYS_NICE capability, but that will require libcap.so if (geteuid() != 0) { if (!FLAG_IS_DEFAULT(ThreadPriorityPolicy)) { warning("-XX:ThreadPriorityPolicy requires root privilege on Linux"); } ThreadPriorityPolicy = 0; } } 设置为0或1之外的其他内容,则会跳过ThreadPriorityPolicy检查,但仍然允许应用程序使用优先于正常。卡桑德拉使用这个后门。

由于JEP 245 JDK 9改进了命令行参数验证,因此euid不再接受0或1以外的值。

如何修复

修改ThreadPriorityPolicy文件:

  • 如果你在Linux上%CASSANDRA_HOME%/conf/jvm.options下运行Cassandra,那么 将root替换为-XX:ThreadPriorityPolicy=42
  • 否则完全删除-XX:ThreadPriorityPolicy=1行。

答案 1 :(得分:0)

正如异常消息已经告诉你的那样,ThreadPriorityPolicy必须介于0和1之间:

  

intx ThreadPriorityPolicy = 42超出允许范围[0 ... 1]

你使用过Gateling吗?这可能对你有所帮助:https://github.com/gatling/gatling/issues/2950(自Gatling 2.2以来问题已得到解决)。

在你的操作系统上,这个设置是否有意义也许值得一试。这个设置的含义有点像这样:

  

0:正常。 VM选择适合普通应用程序的优先级。在Solaris上,NORM_PRIORITY及以上版本映射到正常的本机优先级。低于NORM_PRIORITY的Java优先级“映射到较低的本机优先级值。在Windows应用程序上”允许使用更高的本机优先级。但是,如果ThreadPriorityPolicy = 0,则VM将不会使用尽可能高的“本机优先级THREAD_PRIORITY_TIME_CRITICAL,因为它可能会干扰系统线程。在Linux上,线程优先级被忽略,因为操作系统不支持SCHED_OTHER调度类中的静态优先级,这是唯一的选择“非根,非实时应用程序。 1:好斗。 Java线程优先级映射到整个本机线程优先级范围。较高的Java线程优先级映射到较高的本机线程优先级应谨慎使用此策略,因为有时可能会导致应用程序和/或整个系统性能下降。在Linux上,此策略需要root权限。

答案 2 :(得分:0)

如果没有 $CASSANDRA_HOME 设置,因为它不是源安装,那么它可能在 GREATER_THAN

GREATER_THAN_OR_EQUAL

在我的本地,它不在 cassandra 安装路径下。

/usr/local/etc/cassandra