我有一个Silverspripe页面,里面有一个体育Liveticker和一个适用于iOS和Android应用程序的RestAPI。 我不在静态缓存中进行的每个调用都会进行一些系统调用,以设置文件锁。
我的jsonapi控制器中有这个功能:
function image(){
if($this->request->param('ID')){
$id = $this->request->param('ID');
if($id > 0){
$image = Image::get()->distinct(false)->byID($id);
if(is_object($image) && $image->exists()){
$filetype = $image->getExtension();
$width = $this->getRequest()->getVar("width");
$height = $this->getRequest()->getVar("height");
if(isset($width) && isset($height)){
$url = $image->croppedImage($width,$height)->URL;
} elseif(isset($width)){
if($width == 0){
$url = $image->URL;
} else{
$url = $image->setWidth($width)->URL;
//Debug::log("setWidth URL: ".$url);
}
} else{
$url = $image->setWidth(1600)->URL;
}
header("Content-type: image/{$filetype}");
header("Cache-Control: public, max-age=2678400");
header('Content-Length: ' . filesize(Director::baseFolder().$url));
readfile(Director::baseFolder().$url);
die();
}
}
return null;
} else{
return null;
}
}
当我调用它时,即使 ID=0 银条设置了这些文件锁。当 200 个客户端同时调用它时,我的服务器会关闭。100% CPU 使用率,系统调用如下所示:
fcntl(22, F_SETLKW, {type=F_WRLCK, whence=SEEK_SET, start=0, len=1}) = 0
fcntl(22, F_SETLKW, {type=F_UNLCK, whence=SEEK_SET, start=0, len=1}) = 0
fcntl(22, F_SETLKW, {type=F_WRLCK, whence=SEEK_SET, start=0, len=1}) = 0
fcntl(22, F_SETLKW, {type=F_UNLCK, whence=SEEK_SET, start=0, len=1}) = 0
fcntl(22, F_SETLKW, {type=F_WRLCK, whence=SEEK_SET, start=0, len=1}) = 0
fcntl(22, F_SETLKW, {type=F_UNLCK, whence=SEEK_SET, start=0, len=1}) = 0
fcntl(22, F_SETLKW, {type=F_WRLCK, whence=SEEK_SET, start=0, len=1}) = 0
fcntl(22, F_SETLKW, {type=F_UNLCK, whence=SEEK_SET, start=0, len=1}) = 0
fcntl(22, F_SETLKW, {type=F_WRLCK, whence=SEEK_SET, start=0, len=1}) = 0
fcntl(22, F_SETLKW, {type=F_UNLCK, whence=SEEK_SET, start=0, len=1}) = 0
fcntl(22, F_SETLKW, {type=F_WRLCK, whence=SEEK_SET, start=0, len=1}) = 0
fcntl(22, F_SETLKW, {type=F_UNLCK, whence=SEEK_SET, start=0, len=1}) = 0
fcntl(22, F_SETLKW, {type=F_WRLCK, whence=SEEK_SET, start=0, len=1}) = 0
fcntl(22, F_SETLKW, {type=F_UNLCK, whence=SEEK_SET, start=0, len=1}) = 0
它是像_ss_environment.php等文件。(可能是正在使用的每个.php。 所以克林斯用所有这些锁互相阻挡。如何禁用它?是否有某种全局变量来禁用不需要的文件锁? 还是我必须在核心中更改它?我在哪里可以找到它?
在我看来,为 200 个并发用户提供服务是一项相当大的要求。
您假设 SilverStripe 导致文件锁定,但我认为您正在达到服务器、服务配置和所用应用程序堆栈可以处理的最大范围。
例如,_ss_environment.php刚刚加载了
include_once(SS_ENVIRONMENT_FILE);
所以只是基本的php,所以锁可能来自操作/php系统级别。
在您的情况下,您需要弄清楚单个Web服务器可以体面地服务的最大值是多少,并开始调整php的值,使用的Web服务器以及操作系统级别的值,因为这会将文件提供给php最终处理:
- 缓存>可以推送到内存的任何内容
- 使用 PHP7 可以提升速度(需要在核心上修复一些东西)
- 设置操作系统最大打开文件数 https://www.cyberciti.biz/faq/linux-increase-the-maximum-number-of-open-files/
- 和其他各种东西
我曾经发现这本书 https://www.scalingphpbook.com/有很多关于充分利用服务器的好细节。
使用设置进行优化的想法只能到此为止,因此您可能会考虑垂直或水平缩放节点。
数据库水平和垂直缩放之间的区别。
如果可能的话,让它按负载添加资源,以便在非高负载时间上更具成本效益。