当我尝试启动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)
答案 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
文件:
%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